<div dir="ltr">Hi Ben,<br><br><div class="gmail_quote">On Mon, 9 Mar 2015 at 21:58 Ben Hoyt <<a href="mailto:benhoyt@gmail.com">benhoyt@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Note that this benchmark is invalid for a couple of reasons. (...)<br></blockquote><div><br></div><div>Thanks a lot for the guidance Ben, greatly appreciated. Just starting to take an interest in the development of CPython and so something like running a benchmark seemed like a good a place as any to start.</div><div><br></div><div>Since I want to get comfortable with compiling from source I tried this again. Instead of applying the patch, since the issue is now closed, I just compiled from the tip of the default branch which at the time was 94920:0469af231d22. I also didn't configure with --with-pydebug. Here are the new results:</div><div><br></div><div><div><i>Ryans-MacBook-Pro:cpython rstuart$ ./python.exe ~/Workspace/python/scandir/benchmark.py</i></div><div>Using Python 3.5's builtin os.scandir()</div><div>Comparing against builtin version of os.walk()</div><div>Priming the system's cache...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 1/3...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 2/3...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 3/3...</div><div>os.walk took 0.061s, scandir.walk took 0.012s -- 5.2x as fast</div><div><i><br></i></div><div><i>Ryans-MacBook-Pro:cpython rstuart$ ./python.exe ~/Workspace/python/scandir/benchmark.py -s</i></div><div>Using Python 3.5's builtin os.scandir()</div><div>Comparing against builtin version of os.walk()</div><div>Priming the system's cache...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 1/3...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 2/3...</div><div>Benchmarking walks on /Users/rstuart/Workspace/python/scandir/benchtree, repeat 3/3...</div><div>os.walk size 23400, scandir.walk size 23400 -- equal</div><div>os.walk took 0.109s, scandir.walk took 0.049s -- 2.2x as fast</div></div><div><br></div><div>This is on a Retina Mid 2012 MacBook Pro with an SSD.</div><div><br>Cheers</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
you're compiling Python in debug mode (--with-pydebug), which produces<br>
significantly slower code in my tests -- for example, on Windows<br>
benchmark.py is about twice as slow when Python is compiled in debug<br>
mode.<br>
<br>
Second, as the output above shows, benchmark.py is "Using slower<br>
ctypes version of scandir" and not a C version at all. If os.scandir()<br>
is available, benchmark.py should use that, so there's something wrong<br>
here -- maybe the patch didn't apply correctly or maybe you're testing<br>
with a different version of Python than the one you built?<br>
<br>
In any case, the easiest way to test it now is to download Python 3.5<br>
alpha 2 which just came out:<br>
<a href="https://www.python.org/downloads/release/python-350a2/" target="_blank">https://www.python.org/<u></u>downloads/release/python-<u></u>350a2/</a><br>
<br>
I just tried this on my Mac Mini (i5 2.3GHz, 2 GB RAM, HFS+ on<br>
rotational drive) and got the following results:<br>
<br>
Using Python 3.5's builtin os.scandir()<br>
Comparing against builtin version of os.walk()<br>
Priming the system's cache...<br>
Benchmarking walks on benchtree, repeat 1/3...<br>
Benchmarking walks on benchtree, repeat 2/3...<br>
Benchmarking walks on benchtree, repeat 3/3...<br>
os.walk took 0.074s, scandir.walk took 0.016s -- 4.7x as fast<br>
<br>
> I then did ./python.exe ~/Workspace/python/scandir/<u></u>benchmark.py -s and got:<br>
<br>
Also note that "benchmark.py -s" tests the system os.walk() against a<br>
get_tree_size() function using scandir's DirEntry.stat().st_size,<br>
which provides huge gains on Windows (because stat().st_size doesn't<br>
require on OS call) but only modest gains on POSIX systems, which<br>
still require an OS stat call to get the size (though not the file<br>
type, so at least it's only one stat call). I get "2.2x as fast" on my<br>
Mac for "benchmark.py -s".<br>
<br>
-Ben<br>
</blockquote></div></div>