haskell / criterion

A powerful but simple library for measuring the performance of Haskell code.
http://www.serpentine.com/criterion
BSD 2-Clause "Simplified" License
503 stars 86 forks source link

please document that `nf` is (contains) an IO action #274

Open jwaldmann opened 1 year ago

jwaldmann commented 1 year ago

(I am not sure about this but it is a source of confusion in #273 )

We have

nf :: NFData b => (a -> b) -> a -> Benchmarkable

and Benchmarkable is "A pure function or impure action that can be benchmarked." (says the haddock).

So what happens if I write this:

import Criterion.Main

main = defaultMain
  $ let b =  nf length [1 .. 10^7 :: Int ] in
  [ bench "1" b
  , bench "2" b
  , bench "3" b
  ]

I do get the same timings - the value is shared, but the value denotes the action that performs the evaluation. (I think.)