packages feed

ekg-core-0.1.0.0: benchmarks/Distribution.hs

{-# LANGUAGE BangPatterns, OverloadedStrings #-}

-- | Perform 100,000 atomic sample additions using 100 concurrent
-- writers.
module Main where

import Control.Concurrent
import Control.Monad
import System.Metrics.Distribution

main :: IO ()
main = do
    distrib <- new
    locks <- replicateM n newEmptyMVar
    mapM_ (forkIO . work distrib iters) locks
    mapM_ takeMVar locks
  where
    n = 100
    iters = 100000

    work :: Distribution -> Int -> MVar () -> IO ()
    work !_ 0 !lock     = putMVar lock ()
    work distrib i lock = add distrib 1.0 >> work distrib (i - 1) lock