timestats

A library for profiling time in Haskell applications

https://github.com/tweag/timestats

Stackage Nightly 2025-07-23:0.2.0
Latest on Hackage:0.2.0

See all snapshots timestats appears in

BSD-3-Clause licensed by Facundo Domínguez
Maintained by [email protected]
This version can be pinned in stack with:timestats-0.2.0@sha256:8c76da9cba6004d1d3955cfc1de25f0a74e7f4706dd385b91d4769d768dfdfca,1126

Module documentation for 0.2.0

Depends on 3 packages(full list with versions):

timestats

This is a simple library for profiling time that can help when more sophisticated tools aren’t available or needed. Most programs should be possible to analyze by instrumenting the code with a few calls and then building and running the application as usual.

This library associates fragments of a program with labels, and measures the execution time of these fragments using the function getMonotonicTimeNSec.

Multiple measures of a same program fragment (or different fragments using the same label) are aggregated and reported at chosen times of the execution.

The announcement post contains additional motivation.

Usage

import Control.Exception (evaluate)
import qualified Debug.TimeStats as TimeStats (printTimeStats, measureM)

fib n = if n < 2 then 1 else fib (n - 1) + fib (n - 2)

main = do
    -- measureM collects the time taken to compute the given action
    -- and stores it associated with a given label in global state.
    TimeStats.measureM "fib" $ evaluate (fib 31)
    -- measuring multiple times with the same label adds up
    -- the time taken by all of those invocations
    TimeStats.measureM "fib2" $ evaluate (fib 30)
    -- adds up to the existing "fib2" stats
    TimeStats.measureM "fib2" $ evaluate (fib 29)
    TimeStats.printTimeStats

The output when running the program with timestats enabled will look as

$ DEBUG_TIMESTATS_ENABLE=1 ./a.out

 fib: 2.055s  count: 1
fib2: 2.071s  count: 2

timestats is enabled by setting the environment variable DEBUG_TIMESTATS_ENABLE to any value ahead of invoking any function in Debug.TimeStats.

See the API documentation for further details.

Changes

Revision history for timestats

0.2.0 – 2024-05-24

  • Expose Debug.TimeStats.measureMWithLiftIO.

0.1.4.1 – 2024-05-23

  • Add Debug.TimeStats.Unsafe.unsafeMeasureM to measure in some more monads.
  • Expose Debug.TimeStats.enabled.

0.1.3 – 2024-05-19

  • Change the type of measureM to work with MonadIO instances only. Here’s a discussion on why the previous interface was not obvious enough.

0.1.2 – 2024-05-17

  • Change the type of measureM to work in any monad (not only MonadIO instances).

0.1.1 – 2023-11-05

  • Format counts with a thousand separator

0.1.0 – 2022-07-15

  • First version.