gauge

small framework for performance measurement and analysis

https://github.com/vincenthz/hs-gauge

Version on this page:0.2.3
LTS Haskell 22.14:0.2.5
Stackage Nightly 2024-03-28:0.2.5
Latest on Hackage:0.2.5

See all snapshots gauge appears in

BSD-3-Clause licensed by Bryan O'Sullivan
Maintained by Vincent Hanquez
This version can be pinned in stack with:gauge-0.2.3@sha256:ce41cb66ebf730a5050181db0338b1a4b3f76ac71331bf5070089bcd4352ff46,3777

Module documentation for 0.2.3

  • Gauge
    • Gauge.Benchmark
    • Gauge.Main
      • Gauge.Main.Options

Gauge: a clone of criterion

This is a clone of criterion with a code / dependencies on a diet. It works the same way as criterion for outputing to terminal benchmark data.

features compared to criterion

missing:

  • JSON export
  • HTML/javascript pages
  • Glob benchmark matching

Added:

  • Small condensed output (-s or --small)
  • Raw measurements dumping (CSV)

Future Feature Plan

  • Remove further dependencies
  • storing benchmarks data in CSV and JSON
  • Add a standalone program taking benchmark data files and rendering to html/javascript/graphs
  • Make the library more useful as a standalone library to gather benchmark numbers related to functions in a programatic way

Small mode

It’s hard to compare many benchmarks with criterion, so gauge has a --small output:

identity                                 mean 41.65 ns  ( +- 2.246 ns  )
slow                                     mean 163.9 ns  ( +- 9.683 ns  )

Direct dependencies removed compared to criterion

Number of total dependencies (direct & indirect):

  • gauge: 12 dependencies
  • criterion: 63 dependencies

Dependencies removed:

  • Glob 0.8.0
  • abstract-deque 0.3
  • abstract-par 0.3.3
  • aeson 1.1.2.0
  • ansi-terminal 0.6.3.1
  • ansi-wl-pprint 0.6.7.3
  • array 0.5.1.1
  • attoparsec 0.13.1.0
  • base-compat 0.9.3
  • base-orphans 0.6
  • binary 0.8.3.0
  • blaze-builder 0.4.0.2
  • bytestring 0.10.8.1
  • cassava 0.4.5.1
  • cereal 0.5.4.0
  • code-page 0.1.3
  • containers 0.5.7.1
  • criterion 1.2.2.0
  • directory 1.3.0.0
  • dlist 0.8.0.3
  • erf 2.0.0.0
  • exceptions 0.8.3
  • filepath 1.4.1.1
  • ghc-boot-th 8.0.2
  • hashable 1.2.6.1
  • integer-gmp 1.0.0.1
  • integer-logarithms 1.0.2
  • js-flot 0.8.3
  • js-jquery 3.2.1
  • math-functions 0.2.1.0
  • microstache 1.0.1.1
  • monad-par 0.3.4.8
  • monad-par-extras 0.3.3
  • mtl 2.2.1
  • mwc-random 0.13.6.0
  • optparse-applicative 0.13.2.0
  • parallel 3.2.1.1
  • parsec 3.1.11
  • pretty 1.1.3.3
  • process 1.4.3.0
  • random 1.1
  • scientific 0.3.5.2
  • statistics 0.14.0.2
  • stm 2.4.4.1
  • tagged 0.8.5
  • template-haskell 2.11.1.0
  • text 1.2.2.2
  • time 1.6.0.1
  • time-locale-compat 0.1.1.3
  • transformers-compat 0.5.1.4
  • unix 2.7.2.1
  • unordered-containers 0.2.8.0
  • uuid-types 1.0.3
  • vector-algorithms 0.7.0.1
  • vector-binary-instances 0.2.3.5
  • vector-th-unbox 0.2.1.6

Criterion graph of dependencies:

Criterion

Gauge graph of dependencies:

Gauge

Changes

0.2.3

  • Add a new benchmark matching option “-m exact” to match the benchmark name exactly.

0.2.2

  • Write data to CSV file in quick mode too.
  • Fix the CSV file header to match with the data rows for the --csvraw case.
  • Fix issue with GC metrics in 32 bits that would silently wrap and failure in optional machinery.
  • Simplify dependencies in tests using foudation checks.

0.2.1

  • Inline math-functions & mwc-random:
    • Remove most functions, instances and types, that are unnecessary for gauge
    • Remove unsafe seeding with partial seed (unused in gauge anyway)
    • Remove vector-th-unbox dependency (transitively template-haskell, pretty, ghc-boot-th)
    • Remove time dependency
  • Re-add Gauge.Benchmark to Gauge.Main to keep the transition between criterion and gauge easy
  • Fix cycles reporting on linux, osx and windows
  • Add some extra callstack for reporting on partial function
  • Fix compilation with Semigroup => Monoid (compilation on 8.4). still unsupported
  • Add some color on terminal output

0.2.0

  • Usability: Simplify and organize the documentation and user APIs.
  • Functionality:
    • Add measurement and reporting of more performance counters on Unices (collected via getrusage) for example page faults, user time, system time and rss are now available in verbose mode.
    • Re-enable CSV analysis with the same output format as criterion (--csv)
    • Add CSV measurement dumping with --csvraw
  • Control: Provide better control over measurement process with --min-samples, --min-duration and --include-first-iter flags.
  • Speed: Add --quick flag that provides results much faster (10x) without using statistical analysis.
  • Reliability:
    • Fix a bug in GC stats collection and reporting with GHC 8.2 that caused incorrect reporting of some GC stats.
    • Fix a bug in statistical regression that caused incorrect reporting of mean and other stats.
    • Improve reliability by isolating benchmarks from one another using the --measure-with flag. The results of one benchmark are no longer affected by other benchmarks because each benchmark runs in a separate process.
    • Introduce an optional value type Optional with an efficient runtime representation to replace the ad-hoc fromXXX functions and the untyped approach.
  • Modularity:
    • Introduce --measure-only flag that allows just measurement and no analysis or reporting.
    • Provide modular build, measurement code is cleanly separated from statistical analysis code. As a result a leaner version can now be built without analysis code (controlled by the analysis build flag).
    • Clean, refactor & rewrite source code
  • Remove code-page dependency

0.1.3

  • Simplify monad handling, remove foundation as dependency

0.1.2

  • condensed display with --small

0.1.1

  • remove optparse-applicative

0.1.0

  • remove bunch of dependencies
  • initial import of criterion-1.2.2.0