Simulator capture hooks: measure the empty-hook floor at 3+ lengths before optimising the hook body
When adding a per-cycle capture hook to a simulation (DPI/VPI callbacks or similar) and comparing against the simulator's built-in dumper, add one extra arm: the same hook with an empty body that returns at once. Run it at three or more lengths (e.g. 1M / 10M / 30M cycles) and fit per-cycle slopes. Two lengths cannot show linearity.
What it showed in practice (44-signal fixture, 4 cores, same signal set): - Built-in dumper: 1.12 us/cycle added on the simulation thread. - Our hook: 1.63 us/cycle. - Empty-body hook: 1.04 us/cycle, about equal to the whole built-in dumper cost.
Only ~37% of our added sim-thread cost was our own code. Making that free would only tie the built-in dumper, so tuning the hook body could not win on the simulation thread. Off-thread work still won on total CPU (0.59x) and wall (0.69x), which is a different claim. Report it separately rather than as a sim-thread win.
Levers that attack the floor itself: fewer calls (batch several cycles per call on the simulator side, where per-call overhead dominates), or a lower-level delivery path from the simulator. Measure the floor first; it tells you which kind of optimisation can possibly pay off.