Comparison of the performance of FFI vs XS zeromq bindings. For FFI the
ZMQ::FFI
bindings are used, first using FFI::Raw
on the backend and then
using FFI::Platypus
. For XS ZMQ::LibZMQ3
is used.
Comparison is done using the zeromq weather station example, first by timing
wuclient.pl using the various implementations, and then by profiling
wuserver.pl using Devel::NYTProf
. When profiling the server is changed to
simply publish 1 million messages and exit.
Weather station example code was lightly optimized (e.g. don't declare vars in loop) and modified to be more consistent.
Additionally, a more direct benchmark and comparison of FFI::Platypus
vs XS
xsubs is also done.
C and Python implementation results are provided as a baseline for performance.
All the code that was created or modified for these benchmarks is listed at the end (C/Python wuclient/wuserver code can be found in the zmq guide).
CPU: Intel Core Quad i7-2600K CPU @ 3.40GHz
Mem: 4GB
OS: Arch Linux
ZMQ: 4.0.5
Perl: 5.20.1
ZMQ::FFI = 0.19 (FFI::Raw backend), dev (FFI::Platypus backend)
FFI::Raw = 0.32
FFI::Platypus = 0.31
ZMQ::LibZMQ3 = 1.19
Further optimization:
__attribute__((regparm(6)))
on our internal methods. Doesn't appear to make a difference.(different machine; the FFI2[a-k] versions are identical except for their names.)
Is that a fair comparison? No, but I suspect that the profile data is pretty close to the same for most common applications—the main factor is likely to be that there is a single integer return value, and that's true for a lot of functions. In other words, my prediction is we'll get most of the improvement incorporating far fewer changes than I've actually made.
All of this really depends on having multiple Platypus "implementations", as discussed at PerlFFI/FFI-Platypus#44. However, I think I've made a good start on that already.