Since two weeks, I'm trying to use AsyncIO on top of PyPy3.3

>From my experience, two main elements aren't present on PyPy3.3:
1. pip doesn't work on PyPy3 => For pure Python libraries, you can install
Python packages in CPython pyvenv and change PYTHONPATH
2. Monotonic clock and time.get_clock_info() aren't implemented => The
workaround I've found is to use a standard clock (I know it's important to
use monotonic, it's only for tests) and hardcode the answer
of time.get_clock_info(). At least for me, it isn't very easy to implement
monotonic clock in PyPy.

Nevertheless, I've tested:
1. aiotests: All tests passed
2. Several random scripts from AsyncIO doc: everything is ok
3. aiohttp examples: no issues
4. API-Hour+aiohttp.web: It runs like on CPython 3.4

It's a good surprise for me, I didn't think it should be possible to use
PyPy directly right now: I found only one bug with "yield from" quickly
fixed by PyPy developers.

As usual, I've did some benchmarks. You must note four points:
1. PyPy 3.3 is not yet released: certainly some improvements should be
available when it will be released
2. My PyPy benchmark doesn't use ujson, because ujson works only with
CPython. It should change some values if ujson is ported for PyPy.
3. More I launch benchmarks on PyPy daemon, more I've performances. I've
launched several 5 minutes benchmarks before to launch theses 1 minutes.
4. this use case it's a micro-benchmark, you don't have any connections to
a backend like PostgreSQL or Redis, more realistic use cases where AsyncIO
has better results.

I've redid the same benchmark I've told you few days ago with simple JSON
payload.

*PyPy + API-Hour + aiohttp.web:*

$ wrk -t8 -c256 -d1m http://192.168.2.100:8008/json
Running 1m test @ http://192.168.2.100:8008/json
  8 threads and 256 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    *32.89ms*   18.58ms 260.08ms   78.10%
    Req/Sec     0.99k   117.11     1.42k    71.97%
  472966 requests in 1.00m, 87.96MB read
Requests/sec:   *7883.06*
Transfer/sec:      1.47MB

*PyPy + API-Hour + AsyncIO:*

$ wrk -t8 -c256 -d1m http://192.168.2.100:8009/json
Running 1m test @ http://192.168.2.100:8009/json
  8 threads and 256 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     *3.32ms*   11.99ms 224.86ms   95.26%
    Req/Sec    12.63k     4.46k   43.67k    70.53%
  5744657 requests in 1.00m, 0.96GB read
Requests/sec:  *95760.07*
Transfer/sec:     16.35MB


To remember, the results I give you for WSGI and API-Hour on CPython:

*WSGI:*

$ wrk -t8 -c256 -d1m http://192.168.2.100:8080/json
Running 1m test @ http://192.168.2.100:8080/json
  8 threads and 256 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     *1.81ms*    2.24ms  32.56ms   99.04%
    Req/Sec    20.49k     3.09k   52.56k    81.39%
  9300719 requests in 1.00m, 1.59GB read
Requests/sec: *155019.04*
Transfer/sec:     27.05MB

*API-Hour + aiohttp.web:*

$ wrk -t8 -c256 -d1m http://192.168.2.100:8008/json
Running 1m test @ http://192.168.2.100:8008/json
  8 threads and 256 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    *18.36ms*   11.36ms 117.66ms   67.44%
    Req/Sec     1.79k   238.97     2.65k    74.02%
  854843 requests in 1.00m, 158.16MB read
Requests/sec:  *14248.79*
Transfer/sec:      2.64MB

*API-Hour + AsyncIO:*

$ wrk -t8 -c256 -d1m http://192.168.2.100:8009/json
Running 1m test @ http://192.168.2.100:8009/json
  8 threads and 256 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     *1.96ms*    3.55ms  60.51ms   99.05%
    Req/Sec    19.77k     3.06k   55.78k    85.49%
  8972814 requests in 1.00m, 1.49GB read
Requests/sec: *149565.74*
Transfer/sec:     25.39MB

As you can see, *in this specific benchmark with theses hit values*,
PyPy3.3 is slower than CPython with AsyncIO for now.
But, I imagine that the PyPy dev team goal is more to be fully compliant
with CPython 3.3 than have the best performances.

Finally, if you are interested in to help PyPy project but you have no
time, you can donate money: http://pypy.org/py3donate.html
I've did a recurring donation for the PyPy project.
--
Ludovic Gasc (GMLudo)
http://www.gmludo.eu/

Reply via email to