[pypy-dev] ctypes rawffi and ffi

Elefterios Stamatogiannakis estama at gmail.com
Sun Dec 11 21:28:29 CET 2011


I'm exploring pypy's code so as to speed up callbacks from C code, so as 
to speed up sqlite module's UDF.

I have some questions:

  - What are the differences between ctypes, rawffi and ffi. Where 
should each one of them be used?

- I see that ctypes is build on top of rawffi and ffi. If one wishes to 
work around ctypes (so as to not have ctype's overhead) which of the 
rawffi or ffi should he use? Which of the two is faster at runtime?

  - How can i create a null pointer with _ffi?

And some remarks:

By only modifying pypy's sqlite module code, i managed to speed up 
sqlite's callbacks by 30% (for example there is a "for i in 
range(nargs)" line in  _sqlite3. _convert_params, which is a hot path).

Also the following line in _ctypes/function.py ._wrap_callable

args = [argtype._CData_retval(argtype.from_address(arg)._buffer)
                         for argtype, arg in zip(argtypes, args)]

Occupies a large percentage of the overall callback time (around 60-70%).

Assuming that pypy JITs all of the above callback code. Is it a problem 
having all these memory allocations for each callback (my test does 10M 
callbacks)? Is there a way to avoid as much as possible all these memory 
allocations.

Right now CPython runs my test (10M callbacks) in 1.2 sec and pypy needs 
from 9 to 14 secs. I suspect that the large spread of pypy's run times 
are due to GC.

Thank you in advance for your answers.

lefteris.


More information about the pypy-dev mailing list