@@ -1,6 +1,7 @@
11import Control.Parallel.Strategies
22import Criterion.Main
33import Data.Char (ord)
4+import Data.IORef
45import Data.Maybe (fromJust)
56import Data.Word
67import qualified Data.Set as Set
@@ -11,7 +12,7 @@ import qualified Data.UUID.V1 as U
1112import qualified Data.UUID.V3 as U3
1213import qualified Data.UUID.V5 as U5
1314import System.Random
14−
15+import System.Random.Mersenne.Pure64
1516
1617instance NFData BL.ByteString where
1718 rnf BL.Empty = ()
@@ -36,6 +37,15 @@ main = do
3637 BL.pack [0x16, 0x9a, 0x5a, 0x43, 0xc0, 0x51, 0x4a, 0x16,
3738 0x98, 0xf4, 0x08, 0x44, 0x7d, 0xdd, 0x5d, 0xc0]
3839 u3 = fromJust $ U.fromString "dea6f619-1038-438b-b4af-f1cdec1e6e23"
40+
41+ -- setup for random generation
42+ randomState <- newPureMT >>= newIORef
43+ let randomUUID = do
44+ state <- readIORef randomState
45+ let (uuid, state') = random state
46+ writeIORef randomState state'
47+ return uuid
48+
3949 defaultMain [
4050 bgroup "testing" [
4151 bench "null non-nil" $ whnf U.null u1,
@@ -52,7 +62,7 @@ main = do
5262 ],
5363 bgroup "generation" [
5464 bench "V1" $ nfIO U.nextUUID,
55− bench "V4" $ nfIO (randomIO :: IO U.UUID),
65+ bench "V4" $ nfIO (randomUUID :: IO U.UUID),
5666 bench "V3" $ nf (U3.generateNamed U3.namespaceURL) n1,
5767 bench "V5" $ nf (U5.generateNamed U5.namespaceURL) n1
5868 ],