Explained · three
We publish comparisons against other people's software, so the method has to be checkable. This is all of it: the machines, the content, the settings each client gets, and the rules that decide whether a run counts as a result or gets thrown away.
The rig
Every client in a comparison runs on one machine, against the same providers, on the same content, within the same round. Nothing is carried over from a previous day.
The rule that decides everything
This is the single most important thing on this page. Every leg ends by finding the largest file the client produced, anywhere in its output, and hashing it against a known-good copy. Size and MD5, on every leg, not on a sample.
We do this because a client's own report of success is not reliable evidence. We have measured a client reporting done on a job whose output directory was empty. We have measured another reporting Completed having delivered raw archive volumes it never unpacked. A repair tool in wide use exits with a failure code after a successful repair. None of those clients was lying; status strings simply mean different things to different authors, and a benchmark that trusts them is measuring vocabulary rather than behaviour.
So the finish line is the same for everyone: the payload exists, at the right size, with the right hash. If a client stops before that, it does not get a time, and the whole column is marked rather than quietly omitted. A slow client that finishes is doing better than a fast one that does not, and the table should say so.
The corollary is that a non-finish is a result, not an error on our part. When we publish one we describe the end state in plain terms, including anything that suggests it is specific to that job rather than general, and we say what the client did instead of finishing.
Order and repetition
Provider throughput varies minute to minute, sometimes by a factor of two or three. Any two measurements taken at different times are partly measuring the weather.
So clients run back to back and interleaved, and the order reverses between repetitions, so that no client is always the one going first into a warm or cold line. A result is the pattern across repetitions, not a best run. When a spread is wide, we publish the range rather than an average that would hide it, and if we do not know why a client's numbers are spread out, we say so instead of inventing a cause.
Comparisons across different rounds are avoided wherever possible. If a claim requires two numbers, we prefer to re-race both in one round rather than subtract one day's figure from another's, because rig state, provider conditions and client versions all drift. When we compare two of our own builds, both builds run in the same round, alternating, on the same content.
The unglamorous checks
Most of these exist because a silent fault once produced a healthy-looking, publishable, wrong number. Each one now runs automatically and stops the round rather than warning.
Where a client needs particular settings to perform well, it gets them, and the round says which. Examples: request pipelining enabled where a client ships with it off, duplicate checking disabled when the same job is downloaded repeatedly, and unpack helpers taken from the client's own bundle rather than a system copy. The aim is that each client is measured at its best rather than at its defaults, since defaults are a separate argument from capability.
What we will not do