on 49c1238 help sign in
typeable/uuid/tests/BenchUUID.hs
140 lines 5.4 kB history raw
1import Control.Parallel.Strategies
2import Criterion.Main
3import Data.Char (ord)
4import Data.IORef
5import Data.Maybe (fromJust)
6import Data.Word
7import qualified Data.Set as Set
8import qualified Data.ByteString.Lazy as BL
9import qualified Data.ByteString.Lazy.Internal as BL
10import qualified Data.UUID.Internal as U
11import qualified Data.UUID.V1 as U
12import qualified Data.UUID.V3 as U3
13import qualified Data.UUID.V5 as U5
14import System.Random
15import System.Random.Mersenne.Pure64
17instance NFData BL.ByteString where
18 rnf BL.Empty = ()
19 rnf (BL.Chunk _ ts) = rnf ts
21instance NFData U.UUID where
22 rnf u = ()
27main :: IO ()
28main = do
29 u1 <- randomIO
30 let s1 = U.toString u1
31 b1 = U.toByteString u1
32 n1 = (map (fromIntegral . ord) "http://www.haskell.org/") :: [Word8]
33 nil2 = fromJust $
34 U.fromString "00000000-0000-0000-0000-000000000000"
35 u2a = fromJust $ U.fromString "169a5a43-c051-4a16-98f4-08447ddd5dc0"
36 u2b = fromJust $ U.fromByteString $
37 BL.pack [0x16, 0x9a, 0x5a, 0x43, 0xc0, 0x51, 0x4a, 0x16,
38 0x98, 0xf4, 0x08, 0x44, 0x7d, 0xdd, 0x5d, 0xc0]
39 u3 = fromJust $ U.fromString "dea6f619-1038-438b-b4af-f1cdec1e6e23"
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
49 defaultMain [
50 bgroup "testing" [
51 bench "null non-nil" $ whnf U.null u1,
52 bench "null nil" $ whnf U.null U.nil,
53 bench "null nil2" $ whnf U.null nil2,
54 bench "eq same" $ whnf (==u2a) u2b,
55 bench "eq differ" $ whnf (==u2a) u3
56 ],
57 bgroup "conversion" [
58 bench "toString" $ nf U.toString u1,
59 bench "fromString" $ nf U.fromString s1,
60 bench "toByteString" $ nf U.toByteString u1,
61 bench "fromByteString" $ nf U.fromByteString b1
62 ],
63 bgroup "generation" [
64 bench "V1" $ nfIO (U.nextUUID testMAC),
65 bench "V4" $ nfIO (randomUUID :: IO U.UUID),
66 bench "V3" $ nf (U3.generateNamed U3.namespaceURL) n1,
67 bench "V5" $ nf (U5.generateNamed U5.namespaceURL) n1
68 ],
69 bench "set making" $ nf Set.fromList uuids
70 ]
72-- | MAC address to use in testing
73testMAC :: U.MAC
74testMAC = U.MAC 0 0 0 0 0 0
76-- 50 uuids, so tests can be repeatable
77uuids :: [U.UUID]
78uuids
79 = map (fromJust . U.fromString)
80 [
81 "35d42593-1fca-4465-b588-a2e78cb996ba",
82 "1e97e407-eca7-4c5d-a947-6fbe9dc168b6",
83 "a41fd7ce-a053-4c0a-a742-77c95b85da2a",
84 "f7e3913a-0fd7-4355-a92f-d73f9b046efa",
85 "8961a35d-55c2-42f3-8680-08fce3986647",
86 "96246c58-d0b4-4e56-a543-356bd59686a9",
87 "72c46194-648c-4b1e-a9fb-2eba060ab43b",
88 "0fc252d4-a37b-4eca-9309-e3d2a59a3a22",
89 "a8aceb5a-6a8e-43f3-85bb-9653a3c1ebcd",
90 "b23d1118-6bc8-4add-9d56-99634d78949f",
91 "5f8c7896-9c4f-4d7e-a4d2-961bda298012",
92 "219a4137-7bc5-42b1-ac95-490948a978e1",
93 "5af5024f-fbe9-45ab-991d-49b655994437",
94 "569dfb33-185d-4a3c-99c4-bc2b83250a7c",
95 "43a58442-aa51-4a5d-8e00-b8a83b5fc5b0",
96 "2865ced1-b54d-4725-8f01-b408f4617424",
97 "b8cfaff0-4dee-4f32-af2f-0469b3e535fc",
98 "63f45bc0-f303-4f1a-b0d6-76f876be626d",
99 "d171eaf3-f20d-45d6-9268-0cc22dfbe887",
100 "7c28f457-ad27-494a-8642-6e47e7f3efb8",
101 "f8de9193-66ff-49e8-9826-fc50858d7855",
102 "2af85f28-cace-4740-b8bb-2b5860f5fdb3",
103 "b12a7a22-edb3-4694-b8f4-0532eaad6112",
104 "5e052a08-8e49-4668-bbe7-77cdbc4679a3",
105 "42d5a68d-3f08-4e39-9b8c-71cc17c538ed",
106 "ba2b1487-b3a4-4a19-98cc-59530f36613f",
107 "e4a5c569-b8ac-4851-8ad2-fbdb89986be2",
108 "35b4a1b6-b5ca-4646-803b-c337ee730d9a",
109 "f0df1206-05d9-49d6-a726-d49fb253e645",
110 "9656a0f0-89b2-4cec-bb1c-fdf5633e1cd7",
111 "d13382f5-04a1-422d-94d6-e47219425816",
112 "b8d0c762-4c6b-4bd0-ad0b-f68988a87166",
113 "06360e85-f18a-44f6-aa72-45f1e60b6b77",
114 "347491ca-62b3-48e8-ac94-6ffebe1318ed",
115 "014339d0-7b2d-4dda-914b-14ee5cb4391b",
116 "dc57931b-4744-41be-b3c4-e24dbeeb606a",
117 "2c9fdcf0-e1d6-4a2d-951d-4766b99032cb",
118 "b6bde422-eea8-4231-bf1c-ee0e56699511",
119 "921073c5-f7c1-4583-ac03-aeb7aef8662b",
120 "eff6a517-aeb1-453e-9810-1b4b324c5a1e",
121 "eadaae8c-cbf8-4e0b-ab80-e34284b07dad",
122 "4d307c36-70d9-453f-8455-ec7e2ba405ed",
123 "53ddef9a-2413-4f7f-8363-cff56ee17c6c",
124 "4dd4c27a-b300-4a00-ab87-eef505275492",
125 "4a5d7001-f0c1-4e2f-8362-8833bda2114b",
126 "0c46f438-9365-406a-b04e-34436806ec25",
127 "b35469cf-05f8-40ff-a38b-117604347957",
128 "f1c54df0-5f59-4891-b3c6-82bac0d814ca",
129 "8091837c-6456-42c3-a686-f4731a41d4f9",
130 "2a0e2efb-a11c-4a44-81ee-3efc37379b48"
131 ]
133#if !(MIN_VERSION_criterion(0,4,0))
134nf f arg = B ( rnf . f) arg
135whnf f arg = B f arg
136#endif
138#if !(MIN_VERSION_criterion(0,4,1))
139nfIO act = rnf `fmap` act
140#endif