timestats: A library for profiling time in Haskell applications

[ bsd3, library, profiling ] [ Propose Tags ]

A simple library for profiling time that can help when more sophisticated tools aren't available or needed.

[Skip to Readme]


Manual Flags


Enable more warnings and fail compilation when warnings occur. Turn this flag on in CI.


Use -f <flag> to enable a flag, or -f -<flag> to disable that flag. More info


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


  • No Candidates
Versions [RSS] 0.1.0
Change log CHANGELOG.md
Dependencies base (>=4.14 && <5), containers, text [details]
License BSD-3-Clause
Copyright 2022 EURL Tweag
Author Facundo Domínguez
Maintainer facundo.dominguez@tweag.io
Category Profiling
Home page https://github.com/tweag/timestats
Bug tracker https://github.com/tweag/timestats/issues
Source repo head: git clone https://github.com/tweag/timestats(tag v0.1.0)
Uploaded by FacundoDominguez at 2022-07-13T01:42:57Z
Distributions NixOS:0.1.0
Downloads 51 total (5 in the last 30 days)
Rating (no votes yet) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for timestats-0.1.0

[back to package description]


This library implements time profiling by focusing on simplicity of use. 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.


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)

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


 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.