mirror of
https://github.com/simonmichael/hledger.git
synced 2024-11-08 07:09:28 +03:00
158 lines
6.9 KiB
Markdown
158 lines
6.9 KiB
Markdown
# Benchmarks
|
|
|
|
<div class=pagetoc>
|
|
|
|
<!-- toc -->
|
|
</div>
|
|
|
|
Benchmarks are standard performance measurements,
|
|
which we define using `bench` declarations in cabal files.
|
|
There is [one in hledger.cabal](https://github.com/simonmichael/hledger/blob/master/hledger/hledger.cabal#L228),
|
|
with related code and data files in [hledger/bench/](https://github.com/simonmichael/hledger/tree/master/hledger/bench).
|
|
|
|
To run the standard hledger benchmark, use `stack bench hledger`.
|
|
This installs haskell dependencies (but not system dependencies) and rebuilds as needed,
|
|
then runs [hledger/bench/bench.hs](https://github.com/simonmichael/hledger/blob/master/hledger/bench/bench.hs),
|
|
which by default shows quick elapsed-time measurements for several operations on a standard data file:
|
|
|
|
```shell
|
|
$ stack bench hledger
|
|
NOTE: the bench command is functionally equivalent to 'build --bench'
|
|
...
|
|
hledger-0.27: benchmarks
|
|
Running 1 benchmarks...
|
|
Benchmark bench: RUNNING...
|
|
Benchmarking hledger in /Users/simon/src/hledger/hledger with timeit
|
|
read bench/10000x1000x10.journal [1.57s]
|
|
print [1.29s]
|
|
register [1.92s]
|
|
balance [0.21s]
|
|
stats [0.23s]
|
|
Total: 5.22s
|
|
Benchmark bench: FINISH
|
|
```
|
|
|
|
bench.hs has some other modes, which you can use by compiling and running it directly.
|
|
`--criterion` reports more detailed and dependable measurements, but takes longer:
|
|
|
|
```shell
|
|
$ cd hledger; stack exec -- ghc -ibench bench/bench && bench/bench --criterion
|
|
...
|
|
Linking bench/bench ...
|
|
Benchmarking hledger in /Users/simon/src/hledger/hledger with criterion
|
|
benchmarking read bench/10000x1000x10.journal
|
|
time 1.414 s (1.234 s .. 1.674 s)
|
|
0.996 R² (0.989 R² .. 1.000 R²)
|
|
mean 1.461 s (1.422 s .. 1.497 s)
|
|
std dev 59.69 ms (0.0 s .. 62.16 ms)
|
|
variance introduced by outliers: 19% (moderately inflated)
|
|
|
|
benchmarking print
|
|
time 1.323 s (1.279 s .. 1.385 s)
|
|
1.000 R² (0.999 R² .. 1.000 R²)
|
|
mean 1.305 s (1.285 s .. 1.316 s)
|
|
std dev 17.20 ms (0.0 s .. 19.14 ms)
|
|
variance introduced by outliers: 19% (moderately inflated)
|
|
|
|
benchmarking register
|
|
time 1.995 s (1.883 s .. 2.146 s)
|
|
0.999 R² (0.998 R² .. NaN R²)
|
|
mean 1.978 s (1.951 s .. 1.995 s)
|
|
std dev 25.09 ms (0.0 s .. 28.26 ms)
|
|
variance introduced by outliers: 19% (moderately inflated)
|
|
|
|
benchmarking balance
|
|
time 251.3 ms (237.6 ms .. 272.4 ms)
|
|
0.998 R² (0.997 R² .. 1.000 R²)
|
|
mean 260.4 ms (254.3 ms .. 266.5 ms)
|
|
std dev 7.609 ms (3.192 ms .. 9.638 ms)
|
|
variance introduced by outliers: 16% (moderately inflated)
|
|
|
|
benchmarking stats
|
|
time 325.5 ms (299.1 ms .. 347.2 ms)
|
|
0.997 R² (0.985 R² .. 1.000 R²)
|
|
mean 329.2 ms (321.5 ms .. 339.6 ms)
|
|
std dev 11.08 ms (2.646 ms .. 14.82 ms)
|
|
variance introduced by outliers: 16% (moderately inflated)
|
|
```
|
|
|
|
`--simplebench` shows a table of elapsed-time measurements for the commands defined in [bench/default.bench](https://github.com/simonmichael/hledger/blob/master/hledger/bench/default.bench).
|
|
It can also show the results for multiple h/ledger executables side by side, if you tweak the bench.hs code.
|
|
Unlike the other modes, it does not link with the hledger code directly, but runs the "hledger" executable found in $PATH (so ensure that's the one you intend to test).
|
|
|
|
```shell
|
|
$ cd hledger; stack exec -- ghc -ibench bench/bench && bench/bench --simplebench
|
|
Benchmarking /Users/simon/.local/bin/hledger in /Users/simon/src/hledger/hledger with simplebench and shell
|
|
Using bench/default.bench
|
|
Running 4 tests 1 times with 1 executables at 2015-08-23 16:58:59.128112 UTC:
|
|
1: hledger -f bench/10000x1000x10.journal print [3.27s]
|
|
1: hledger -f bench/10000x1000x10.journal register [3.65s]
|
|
1: hledger -f bench/10000x1000x10.journal balance [2.06s]
|
|
1: hledger -f bench/10000x1000x10.journal stats [2.13s]
|
|
|
|
Summary (best iteration):
|
|
|
|
+-----------------------------------------++---------+
|
|
| || hledger |
|
|
+=========================================++=========+
|
|
| -f bench/10000x1000x10.journal print || 3.27 |
|
|
| -f bench/10000x1000x10.journal register || 3.65 |
|
|
| -f bench/10000x1000x10.journal balance || 2.06 |
|
|
| -f bench/10000x1000x10.journal stats || 2.13 |
|
|
+-----------------------------------------++---------+
|
|
```
|
|
|
|
bench's --simplebench mode is based on a standalone tool, [tools/simplebench.hs](https://github.com/simonmichael/hledger/blob/master/tools/simplebench.hs).
|
|
simplebench.hs is a generic benchmarker of one or more executables (specified on the command line) against one or more sets of command-line arguments (specified in a file).
|
|
It has a better command-line interface than bench.hs, so you may find it more convenient
|
|
for comparing multiple hledger versions, or hledger and ledger. Eg:
|
|
|
|
```shell
|
|
$ stack exec -- ghc tools/simplebench
|
|
[1 of 1] Compiling Main ( tools/simplebench.hs, tools/simplebench.o )
|
|
Linking tools/simplebench ...
|
|
```
|
|
```shell
|
|
$ tools/simplebench -h
|
|
tools/simplebench -h
|
|
simplebench: at least one executable needed
|
|
bench [-f testsfile] [-n iterations] [-p precision] executable1 [executable2 ...]
|
|
|
|
Run some functional tests with each of the specified executables,
|
|
where a test is "zero or more arguments supported by all executables",
|
|
and report the best execution times.
|
|
|
|
-f testsfile --testsfile=testsfile file containing tests, one per line, default: bench.tests
|
|
-n iterations --iterations=iterations number of test iterations to run, default: 2
|
|
-p precision --precision=precision show times with this precision, default: 2
|
|
-v --verbose show intermediate results
|
|
-h --help show this help
|
|
|
|
Tips:
|
|
- executables may have arguments if enclosed in quotes
|
|
- tests can be commented out with #
|
|
- results are saved in benchresults.{html,txt}
|
|
```
|
|
```shell
|
|
cd hledger; $ ../tools/simplebench -f bench/default.bench hledger ledger
|
|
Using bench/default.bench
|
|
Running 4 tests 2 times with 2 executables at 2015-08-24 04:24:37.257068 UTC:
|
|
|
|
Summary (best iteration):
|
|
|
|
+-----------------------------------------++---------+--------+
|
|
| || hledger | ledger |
|
|
+=========================================++=========+========+
|
|
| -f bench/10000x1000x10.journal print || 3.24 | 0.43 |
|
|
| -f bench/10000x1000x10.journal register || 3.80 | 3.48 |
|
|
| -f bench/10000x1000x10.journal balance || 2.05 | 0.18 |
|
|
| -f bench/10000x1000x10.journal stats || 2.10 | 0.19 |
|
|
+-----------------------------------------++---------+--------+
|
|
```
|
|
|
|
Finally, for quick, fine-grained performance measurements when troubleshooting or optimising, I use
|
|
[dev.hs](https://github.com/simonmichael/hledger/blob/master/dev.hs).
|
|
|
|
|
|
|