====== Guidebook Benchmarks ======
===== Standards =====
==== 5 Is the Number ====
* Each test case should be run 5 times, and averaged.
* 5 may seem somewhat arbitrary because it is.
* We needed //a// standard, so we selected one.
* 5 tests can be easily run by hand, and averaged by hand.
* Automation scripts will create many additional files to be maintained to ensure completeness.
* For many examples, > 5 test will not change results significantly.((In our own tests this appears to hold true.))((If your own tests for a particular example vary wildly, it is possible that your source/tests should be adjusted to compensate and hone in on what you are trying to test.))
* Only display the average.
==== Present Results in Seconds ====
* Consistency means little chance of misreading.
* Stick to the convention of displaying 3 places after the decimal.
* Avoid results that would be //time limit exceeded// wherever possible.
* 1s is a good cutoff for many purposes, 2s for some others.
* For a single column a ''-'' will suffice.
* Entire rows can be omitted when warranted.
* Ignore this rule if it will mislead the reader.
* E.g., If the last row is 105 at .030s, one would likely expect 106 to be .300 if the trend otherwise appears linear. If 106 is //actually// 2 seconds (for reasons we cannot control), this is important information for the reader.
* Ignore this rule if insufficient data would otherwise be presented.
* A table with a single row is not typically useful. A table with a row at 0s, a row at //almost// 0s, and no other rows is also likely to be misleading.
==== Make a Change -> Rerun All Tests ====
* If you make //any// changes to a test file, please rerun //all// associated tests.
* In order to make this possible, put a new ''files:'' page up for any new benchmarks created.
* Ensure that all associated files are included on this ''files:'' page, and //are not// links to other areas.
* This duplication is a violates terseness, but is important to guarantee that tests only rely on one page.
* Otherwise (in the event where many benchmarks refer to a single file location) it is impossible to know what to update and keep all results consistent.
* If you do not believe that you have changed results //prove it// rather than assuming that a change would not happen.
* In order for this guide to be usable, benchmarks must be implicitly worthy of trust.
==== Make All Efforts to Only Test Your Target ====
* Keep all test cases as simple as possible.
* Consider your tests carefully, and make efforts to //only// test the desired language feature.
* For our [[python3:input_tests|standard input benchmarks]] we timed our entire test using the bash ''[[competitive_programming:linux|time]]'' builtin.
* In all cases we stored the results of a read, but we did not maintain them between iterations.
* E.g., We did not want to consider the cost of ''list'' growth outside of ''stdin.readlines()'' where storing an entire file is unavoidable.
* For our [[python3:output_tests|standard output benchmarks]] we decided to read the same data as our [[python3:input_tests|standard input benchmarks]] to maintain consistency, but did not want to account for the cost of reads.
* Instead of the ''[[competitive_programming:linux|time]]'' builtin we opted for the standard Python3 [[https://docs.python.org/3/library/timeit.html|timeit]] library to isolate only writes.
* Some level of judgment on the part of the author at the time is necessary to ensure that these efforts are made correctly.