Author: Antonio Cuni <anto.c...@gmail.com> Branch: Changeset: r45622:87c5f89a4e78 Date: 2011-07-15 15:11 +0200 http://bitbucket.org/pypy/pypy/changeset/87c5f89a4e78/
Log: update this page wrt the new ctypes and _ffi performances. It still contains XXXs though diff --git a/pypy/doc/extending.rst b/pypy/doc/extending.rst --- a/pypy/doc/extending.rst +++ b/pypy/doc/extending.rst @@ -19,12 +19,12 @@ section * Write them in pure python and use direct libffi low-level bindings, See - \_rawffi_ module description. + \_ffi_ module description. * Write them in RPython as mixedmodule_, using *rffi* as bindings. .. _ctypes: #CTypes -.. _\_rawffi: #LibFFI +.. _\_ffi: #LibFFI .. _mixedmodule: #Mixed Modules CTypes @@ -42,41 +42,50 @@ platform-dependent details (compiling small snippets of C code and running them), so it'll benefit not pypy-related ctypes-based modules as well. +ctypes call are optimized by the JIT and the resulting machine code contains a +direct call to the target C function. However, due to the very dynamic nature +of ctypes, some overhead over a bare C call is still present, in particular to +check/convert the types of the parameters. Moreover, even if most calls are +optimized, some cannot and thus need to follow the slow path, not optimized by +the JIT. + .. _`ctypes-configure`: ctypes-implementation.html#ctypes-configure +.. _`CPython ctypes`: http://docs.python.org/library/ctypes.html Pros ---- -Stable, CPython-compatible API +Stable, CPython-compatible API. Most calls are fast, optimized by JIT. Cons ---- -Only pure-python code (slow), problems with platform-dependency (although -we partially solve those). PyPy implementation is now very slow. +Problems with platform-dependency (although we partially solve +those). Although the JIT optimizes ctypes calls, some overhead is still +present. The slow-path is very slow. -_`CPython ctypes`: http://python.net/crew/theller/ctypes/ LibFFI ====== Mostly in order to be able to write a ctypes module, we developed a very -low-level libffi bindings. (libffi is a C-level library for dynamic calling, +low-level libffi bindings called ``_ffi``. (libffi is a C-level library for dynamic calling, which is used by CPython ctypes). This library provides stable and usable API, although it's API is a very low-level one. It does not contain any -magic. +magic. It is also optimized by the JIT, but has much less overhead than ctypes. Pros ---- -Works. Combines disadvantages of using ctypes with disadvantages of -using mixed modules. Probably more suitable for a delicate code -where ctypes magic goes in a way. +It Works. Probably more suitable for a delicate code where ctypes magic goes +in a way. All calls are optimized by the JIT, there is no slow path as in +ctypes. Cons ---- -Slow. CPython-incompatible API, very rough and low-level +It combines disadvantages of using ctypes with disadvantages of using mixed +modules. CPython-incompatible API, very rough and low-level. Mixed Modules ============= @@ -87,15 +96,15 @@ * a mixed module needs to be written in RPython, which is far more complicated than Python (XXX link) -* due to lack of separate compilation (as of April 2008), each +* due to lack of separate compilation (as of July 2011), each compilation-check requires to recompile whole PyPy python interpreter, which takes 0.5-1h. We plan to solve this at some point in near future. * although rpython is a garbage-collected language, the border between C and RPython needs to be managed by hand (each object that goes into the - C level must be explicitly freed) XXX we try to solve this + C level must be explicitly freed). -Some document is available `here`_ +Some documentation is available `here`_ .. _`here`: rffi.html _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit