| Writing a Test |
| ============== |
| |
| Writing a test program is pretty easy. Basically, a test is configured via |
| a monster array in the Run script, which specifics (among other things) the |
| program to execute and the parameters to pass it. |
| |
| The test itself is simply a program which is given the optional parameters |
| on the command line, and produces logging data on stdout and its results on |
| stderr. |
| |
| |
| ============================================================================ |
| |
| Test Configuration |
| ================== |
| |
| In Run, all tests are named in the "$testList" array. This names the |
| individual tests, and also sets up aliases for groups of tests, eg. "index". |
| |
| The test specifications are in the "$testParams" array. This contains the |
| details of each individual test as a hash. The fields in the hash are: |
| |
| * "logmsg": the full name to display for this test. |
| * "cat": the category this test belongs to; must be configured |
| in $testCats. |
| * "prog": the name of the program to execute; defaults to the name of |
| the benchmark. |
| * "repeat": number of passes to run; either 'short' (the default), |
| 'long', or 'single'. For 'short' and 'long', the actual numbers of |
| passes are given by $shortIterCount and $longIterCount, which are |
| configured at the top of the script or by the "-i" flag. 'single' |
| means just run one pass; this should be used for test which do their |
| own multi-pass handling internally. |
| * "stdout": non-0 to add the test's stdout to the log file; defaults to 1. |
| Set to 0 for tests that are too wordy. |
| * "stdin": name of a file to send to the program's stdin; default null. |
| * "options": options to be put on the program's command line; default null. |
| |
| |
| ============================================================================ |
| |
| Output Format |
| ============= |
| |
| The results on stderr take the form of a line header and fields, separated |
| by "|" characters. A result line can be one of: |
| |
| COUNT|score|timebase|label |
| TIME|seconds |
| ERROR|message |
| |
| Any other text on stderr is treated as if it were: |
| |
| ERROR|text |
| |
| Any output to stdout is placed in a log file, and can be used for debugging. |
| |
| COUNT |
| ----- |
| |
| The COUNT line is the line used to report a test score. |
| |
| * "score" is the result, typically the number of loops performed during |
| the run |
| * "timebase" is the time base used for the final report to the user. A |
| value of 1 reports the score as is; a value of 60, for example, divides |
| the time taken by 60 to get loops per minute. Atimebase of zero indicates |
| that the score is already a rate, ie. a count of things per second. |
| * "label" is the label to use for the score; like "lps" (loops per |
| second), etc. |
| |
| TIME |
| ---- |
| |
| The TIME line is optionally used to report the time taken. The Run script |
| normally measures this, but if your test has signifant overhead outside the |
| actual test loop, you should use TIME to report the time taken for the actual |
| test. The argument is the time in seconds in floating-point. |
| |
| ERROR |
| ----- |
| |
| The argument is an error message; this will abort the benchmarking run and |
| display the message. |
| |
| Any output to stderr which is not a formatted line will be treated as an |
| error message, so use of ERROR is optional. |
| |
| |
| ============================================================================ |
| |
| Test Examples |
| ============= |
| |
| Iteration Count |
| --------------- |
| |
| The simplest thing is to count the number of loops executed in a given time; |
| see eg. arith.c. The utlilty functions in timeit.c can be used to implement |
| the fixed time interval, which is generally passed in on the command line. |
| |
| The result is reported simply as the number of iterations completed: |
| |
| fprintf(stderr,"COUNT|%lu|1|lps\n", iterations); |
| |
| The bnenchmark framework will measure the time taken itself. If the test |
| code has significant overhead (eg. a "pump-priming" pass), then you should |
| explicitly report the time taken for the test by adding a line like this: |
| |
| fprintf(stderr, "TIME|%.1f\n", seconds); |
| |
| If you want results reported as loops per minute, then set timebase to 60: |
| |
| fprintf(stderr,"COUNT|%lu|60|lpm\n", iterations); |
| |
| Note that this only affects the final report; all times passed to or |
| from the test are still in seconds. |
| |
| Rate |
| ---- |
| |
| The other technique is to calculate the rate (things per second) in the test, |
| and report that directly. To do this, just set timebase to 0: |
| |
| fprintf(stderr, "COUNT|%ld|0|KBps\n", kbytes_per_sec); |
| |
| Again, you can use TIME to explicitly report the time taken: |
| |
| fprintf(stderr, "TIME|%.1f\n", end - start); |
| |
| but this isn't so important since you've already calculated the rate. |
| |