[pypy-dev] CFFI speed results

Eleytherios Stamatogiannakis estama at gmail.com
Tue Dec 11 18:00:42 CET 2012


Hello,

We have been testing CFFI here for the purpose of speeding up madIS [*], 
and here are some preliminary results.

First of all, under pypy, CFFI is a *lot* faster than ctypes. In 
callback microbenchmarks (using quicksort to call the callbacks), 
pypy/CFFI had ~8-10 times less overhead than pypy/ctypes.

Using libsqlite3 as the C library calling the callbacks, we found that, 
compared to Python/APSW [**] the callback overhead of pypy/CFFI was 3-4 
times larger.

To be able to run madIS, we started from pypy's _sqlite3.py (which uses 
ctypes) and did a rough conversion of it to CFFI. We then changed it to 
be APSW compatible. In the rest of the email, we'll refer to this APSW 
compatible CFFI wrapper, as MSPW.

The end results were very encouraging. Using madIS and for SQL queries 
that didn't produce a lot of columns, we could get speedups up to 2 times.

For SQL queries that produce a lot of columns, we get slowdowns of 2 - 
2.5 times. Running a profiler on pypy/madIS, we found out that the main 
bottleneck is not callback performance any more, but it is regular 
pypy->C call speed.

Whereas Python/APSW spends most of its time on madIS' Python execution 
of functions. Pypy/MSPW spends most of its time (~45-50%) on calling a 
libsqlite3 function that passes a Python string back to libsqlite3, and 
10% in pypy's string.encode('utf-8') function.

So for pypy/MSPW most of the time (55-60%) is spend just to pass a 
string back to libsqlite3.

In Python/APSW the time spended to pass the string back to libsqlite3 is 
<1%.

The libsqlite3 function's header info is:

void sqlite3_result_text(sqlite3_context*, const char*, int, 
void(*)(void*));

In the main query that we've used in our tests, above libsqlite3 
function is called 1.1 Million times.

The times of this query, running under the different options are:

  Python/APSW: 40s
  pypy/MSPW: 2m 3s
  pypy/APSW: 2m 21s

Best regards,

l.

[*] https://code.google.com/p/madis/
[*] https://code.google.com/p/apsw/


More information about the pypy-dev mailing list