Benchmarks
==========
Overview
--------
The gene finding in Prodigal is based on dynamic programming, and the
performance critical part is actually the node connection scoring step,
which attempts to construct the highest-scoring chain of genes inside the
input sequence.
Profiling with Valgrind reveals that it represent two-thirds of
the total cycle count used for finding genes with the original Prodigal code
(647M cycles out of 965M on an example sequence), as seen below:
.. image:: /_images/qcachegrind.prodigal.png
In Pyrodigal, the connection scoring step is being accelerated with a
pre-filtering step so that invalid connections can be skipped. This pre-filtering
step can be computed using SIMD instruction, processing several nodes at once.
Platform-accelerated code is available for MMX, SSE, AVX, and NEON instruction
sets. In addition, a "generic" implementation of the pre-filter is available in
plain C for testing purposes. The pre-filtering can be disabled, in which case
Pyrodigal will fall back to using the original Prodigal code.
Data & Hardware
---------------
All benchmarks were done using 50 bacterial genomes of various size and content
from the `proGenomes database `_. x86-64 Benchmarks
were run on an `Intel NUC `_
`i7-10710U CPU `_
@ 1.10GHz. Arm benchmarks were run on a `Raspberry Pi 4 Model B `_
`ARM Cortex-A72 `_ @ 1.5GHz.
Connection Scoring
------------------
This benchmark evaluates the time needed for scoring all the nodes from a sequence
using either the pre-filter implemented with SIMD (`avx`, `sse`, `mmx`, `neon`),
the generic pre-filter (`Generic`) or no pre-filter at all (`None`).
x86-64
^^^^^^
.. image:: /_images/connection-scoring-x86.svg
Arm
^^^
.. image:: /_images/connection-scoring-arm.svg
Single Run
----------
This benchmark evaluates the time needed for an entire genome to be processed
(both training and gene prediction) by Pyrodigal depending on the use of
a SIMD pre-filter (`avx`, `sse`, `mmx`, `neon`), the generic pre-filter (`Generic`),
no pre-filter at all (`None`); or the time taken by Prodigal (`Prodigal`).
x86-64
^^^^^^
.. image:: /_images/run-single-x86.svg