park-bench: A quick-and-dirty, low-friction benchmark tool with immediate feedback

[ benchmarking, bsd3, library ] [ Propose Tags ] [ Report a vulnerability ]

A quick-and-dirty, low-friction benchmark tool with immediate feedback.


[Skip to Readme]

Downloads

Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the package including the revisions, use 'cabal get'.

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0, 0.1.0.1, 0.1.1.0
Change log CHANGELOG.md
Dependencies array (>=0.5 && <0.6), base (>=4.12 && <4.21), bytestring (>=0.10 && <0.13), ghc-prim (>=0.3 && <0.12), text (>=1.1 && <1.3 || >=2.0 && <2.2) [details]
Tested with ghc ==9.6.5, ghc ==9.8.2, ghc ==9.10.1
License BSD-3-Clause
Copyright Copyright (C) 2020-2023 Mitchell Rosen, Travis Staton
Author Mitchell Rosen, Travis Staton
Maintainer Mitchell Rosen <mitchellwrosen@gmail.com>, Travis Staton <hello@travisstaton.com>
Revised Revision 1 made by mitchellwrosen at 2024-06-25T14:16:47Z
Category Benchmarking
Home page https://github.com/awkward-squad/park-bench
Bug tracker https://github.com/awkward-squad/park-bench/issues
Source repo head: git clone https://github.com/awkward-squad/park-bench
Uploaded by mitchellwrosen at 2023-10-11T01:13:24Z
Distributions LTSHaskell:0.1.1.0, NixOS:0.1.1.0, Stackage:0.1.1.0
Downloads 287 total (11 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2023-10-11 [all 1 reports]

Readme for park-bench-0.1.1.0

[back to package description]

GitHub CI | Hackage Stackage LTS Stackage Nightly Dependencies

Overview

park-bench is a quick-and-dirty benchmarking tool for comparing the performance of Haskell functions. Specifically, it is designed to optimize the workflow in which a programmer makes a small change to a function and wants to measure its performance impact with as little friction as possible.

Screenshot

Configuration

Environment variable name Type Meaning Default value
PARK_BENCH_RUNLEN Float The target number of seconds that each benchmark run takes 0.1

Example usage

Say I am interested in improving the performance of fib, which is a function defined in module MyMathUtilities.Fib in a local package called my-math-utilities.

Step 1: Write the function you'd like to benchmark

First, I'm going to copy the implementation of fib to a new top-level definition called fastfib, tweak its implementation, and export both from module MyMathUtilities.Fib.

If fib was private before, that's ok. We only need to expose it for as long as we are interested in benchmarking.

module MyMathUtilities.Fib (fib, fastfib, ...) where

Step 2: Write a standalone bench/Main.hs module with a main function

Next, I'm going to write a standalone Main.hs in a subdirectory called bench, which will be compiled to an executable that runs my benchmark.

module Main where

-- The module in my local package that I want to benchmark
import MyMathUtilities.Fib

-- This library
import ParkBench

main :: IO ()
main =
  benchmark
    [ function "fib" fib 20
    , function "fastfib" fastfib 20
    ]

Step 3: Define an executable component

Next, I'm going to define an executable component for my benchmark in my my-math-utilities.cabal file.

executable bench
  build-depends:
    base,
    -- The local package that I want to benchmark
    my-math-utilities,
    -- This library
    park-bench
  default-language: Haskell2010
  ghc-options: -O -rtsopts -with-rtsopts=-T
  hs-source-dirs: bench
  main-is: Main.hs

I need to compile the benchmark with -rtsopts -with-rtsopts=-T, otherwise my benchmark will not be able to get RTS statistics from GHC at runtime.

Alternatively, I could compile the benchmark with only -rtsopts, but then I'll have to provide +RTS -T to the executable later.

Step 4: Run the benchmark

If all goes well, I'll have an executable component to run.

cabal run my-math-utilities:exe:bench
stack run my-math-utilities:exe:bench

Or, if I only compiled with -rtsopts, but not -with-rtsopts=-T,

cabal run my-math-utilities:exe:bench -- +RTS -T
stack run my-math-utilities:exe:bench -- +RTS -T

Step 5: Clean up

After benchmarking, I can choose to keep the benchmark (and associated executable component) around, but I'll probably delete them instead. I've learned something, collected some sweet screenshots for my PR, and I'm ready to move on.

Caveat emptor

The statistical analysis performed by park-bench is simplistic, written by a novice, and may have bugs. Results should not necessarily be trusted; please use (or at least compare to) a different tool.