Cffi code is much faster when compiled with a c compiler (API mode) rather than using libfffi (ABI mode) - however this requires a compiler to be installed .
Various other projects (pangocffi and pangocairocffi) can then benefit from similar changes.
This change requires xcffib changes to be accepted - see here
During installation CAIROCFFI_API_MODE=0 or CAIROCFFI_API_MODE not set defaults to the previous ABI mode install which incurs lever overhead on load, runs the ffi_build as before and will dynamically translate arguments to C using the general libffi.
During installation CAIROCFFI_API_MODE=1 compiles a shared library / C extension which dynamically depends on xcd.
At runtime if the shared library / C extension is present it will be used (unless CAIROCFFI_API_MODE =0). The user does not have to arrange for CAIROCFFI_API_MODE =1 to be set. If the extension is not present, the old behavior is used.
To make this work I added the relevant FFI calls / setup.py calls to have the C extension be built.
I don't suggest this be default, but API mode is a potential substantial performance improvement. It also allows full speed threading as the C side unlocks the GIL.
Cffi code is much faster when compiled with a c compiler (API mode) rather than using libfffi (ABI mode) - however this requires a compiler to be installed .
This change allows an install to be made using
CAIROCFFI_API_MODE=1 XCFFIB_API_MODE=1 pip3 install cairocffi
Various other projects (pangocffi and pangocairocffi) can then benefit from similar changes.
This change requires xcffib changes to be accepted - see here
During installation
CAIROCFFI_API_MODE=0
orCAIROCFFI_API_MODE
not set defaults to the previous ABI mode install which incurs lever overhead on load, runs the ffi_build as before and will dynamically translate arguments to C using the general libffi.During installation
CAIROCFFI_API_MODE=1
compiles a shared library / C extension which dynamically depends on xcd.At runtime if the shared library / C extension is present it will be used (unless
CAIROCFFI_API_MODE =0
). The user does not have to arrange forCAIROCFFI_API_MODE =1
to be set. If the extension is not present, the old behavior is used.To make this work I added the relevant FFI calls / setup.py calls to have the C extension be built.
I don't suggest this be default, but API mode is a potential substantial performance improvement. It also allows full speed threading as the C side unlocks the GIL.