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