<br><br><div class="gmail_quote">On 7 October 2011 18:08, Maciej Fijalkowski <span dir="ltr">&lt;<a href="mailto:fijall@gmail.com">fijall@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div><div></div><div class="h5">On Fri, Oct 7, 2011 at 7:04 PM, Michael Foord &lt;<a href="mailto:fuzzyman@gmail.com">fuzzyman@gmail.com</a>&gt; wrote:<br>
&gt;<br>
&gt;<br>
&gt; On 7 October 2011 17:50, Maciej Fijalkowski &lt;<a href="mailto:fijall@gmail.com">fijall@gmail.com</a>&gt; wrote:<br>
&gt;&gt;<br>
&gt;&gt; On Fri, Oct 7, 2011 at 1:33 PM, Igor Katson &lt;<a href="mailto:igor.katson@gmail.com">igor.katson@gmail.com</a>&gt; wrote:<br>
&gt;&gt; &gt; When I first started benchmarking one of my Django sites,<br>
&gt;&gt; &gt; <a href="http://trip-travel.ru/" target="_blank">http://trip-travel.ru/</a> (using postgres driver pypq),<br>
&gt;&gt; &gt; I was disappointed by the results. PyPy was visually much slower than<br>
&gt;&gt; &gt; cPython (I just looked at how the site loads in the browser)<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; But today I got some incredible results, I finally made PyPy to work<br>
&gt;&gt; &gt; faster<br>
&gt;&gt; &gt; than cPython, and found out that it got faster after loading the page<br>
&gt;&gt; &gt; several hundred times with &quot;ab&quot; or &quot;siege&quot;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Here a the results, of mean response time by querying the home page with<br>
&gt;&gt; &gt; apache&#39;s &quot;ab&quot; (cPython 2.7.2, Django 1.3, PyPy 1.6.0), served with<br>
&gt;&gt; &gt; cherrypy<br>
&gt;&gt; &gt; wsgi server:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; After 10 requests (excluding the first request):<br>
&gt;&gt; &gt; cPython - 163.529 ms<br>
&gt;&gt; &gt; PyPy - 460.879 ms<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 50 request more:<br>
&gt;&gt; &gt; cPython - 168.539<br>
&gt;&gt; &gt; PyPy - 249.850<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 100 requests more:<br>
&gt;&gt; &gt; cPython - 166.278 ms<br>
&gt;&gt; &gt; PyPy - 131.104<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 100 requests more:<br>
&gt;&gt; &gt; cPython - 165.820<br>
&gt;&gt; &gt; PyPy - 115.446<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 300 requests more:<br>
&gt;&gt; &gt; cPython - 165.543<br>
&gt;&gt; &gt; PyPy - 107.636<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; 300 requests more:<br>
&gt;&gt; &gt; cPython - 166.425<br>
&gt;&gt; &gt; PyPy - 103.065<br>
&gt;&gt;<br>
&gt;&gt; Thanks for doing the benchmarks :)<br>
&gt;&gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; As we can see, the JIT needs much time to warm up, but when it does, the<br>
&gt;&gt; &gt; result is pretty noticeable.<br>
&gt;&gt; &gt; By the way, with psycopg2, the site responds for 155.766 ms in average<br>
&gt;&gt; &gt; (only<br>
&gt;&gt; &gt; 10 ms faster), so using PyPy with Django makes much sense for me.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; As for now, pypy cannot run with uWSGI, which I use in production, but<br>
&gt;&gt; &gt; maybe<br>
&gt;&gt; &gt; i&#39;ll switch to PyPy for production deployments if &quot;PyPy + PyPQ + Some<br>
&gt;&gt; &gt; pure<br>
&gt;&gt; &gt; python WSGI server&quot; suite will outperform (uWSGI + cPython + psycopg2).<br>
&gt;&gt; &gt; Though, the need to load the page 500 times after each server reload is<br>
&gt;&gt; &gt; not<br>
&gt;&gt; &gt; comfortable.<br>
&gt;&gt;<br>
&gt;&gt; I&#39;ve heard people using gunicorn. Maybe this is a good try? Loading<br>
&gt;&gt; the pages is indeed annoying, but you need to load it a couple times<br>
&gt;&gt; for results not to be noticably slower :) We kind of know that the JIT<br>
&gt;&gt; warmup time is high, but it&#39;s partly a thing to fix and partly an<br>
&gt;&gt; inherent property of the JIT.<br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; FWIW I shared this internally at Canonical, and whilst people were impressed<br>
&gt; there was some concern that having substantially worse performance for the<br>
&gt; first few hundred requests would a) be a showstopper and b) screw up<br>
&gt; metrics. The technique of deliberate warming immediately after restart is<br>
&gt; interesting, but it would be hard to hit all the code paths.<br>
&gt;<br>
&gt; I realise this is inherent in the way the jit works - but I thought it was a<br>
&gt; response worth sharing. I also assured them that pre-warm-up performance<br>
&gt; would continue to improve as pypy improves. ;-)<br>
&gt;<br>
&gt; All the best,<br>
&gt;<br>
&gt; Michael Foord<br>
&gt;<br>
<br>
</div></div>It&#39;s also true for anything based on JVM and I&#39;ve *never* seen anyone<br>
complain about it. The whole concept of a JIT is just &quot;new&quot; to python<br>
world. Seriously, would actually anyone notice if first 50 requests<br>
after restart take extra 200ms??? I&#39;m not sure, my computer and my<br>
internet connection both have hiccups of over 200ms. Note that many<br>
code paths are common, which means that speed up is also shared.<br>
</blockquote></div><br>I think you have a point and I&#39;ve added your response to the internal discussion.<br><br>Michael<br clear="all"><br>-- <br><pre cols="72"><a href="http://www.voidspace.org.uk/" target="_blank">http://www.voidspace.org.uk/</a><br>
<br>May you do good and not evil<br>May you find forgiveness for yourself and forgive others<br>May you share freely, never taking more than you give.<br>-- the sqlite blessing <a href="http://www.sqlite.org/different.html" target="_blank">http://www.sqlite.org/different.html</a></pre>

<br>