MyNixOS website logo
Description

A library for profiling time in Haskell applications.

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.

Metadata

Version

0.2.0

Platforms (75)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows