uuid-1.2.0: tests/BenchUUID.hs
import Control.Parallel.Strategies
import Criterion.Main
import Data.Char (ord)
import Data.Maybe (fromJust)
import Data.Word
import qualified Data.Set as Set
import qualified Data.ByteString.Lazy as BL
import qualified Data.ByteString.Lazy.Internal as BL
import qualified Data.UUID.Internal as U
import qualified Data.UUID.V1 as U
import qualified Data.UUID.V3 as U3
import qualified Data.UUID.V5 as U5
import System.Random
instance NFData BL.ByteString where
rnf BL.Empty = ()
rnf (BL.Chunk _ ts) = rnf ts
instance NFData U.UUID where
rnf u = ()
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"
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 (randomIO :: 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
]
-- 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"
]
#if !(MIN_VERSION_criterion(0,4,0))
nf f arg = B ( rnf . f) arg
whnf f arg = B f arg
#endif
#if !(MIN_VERSION_criterion(0,4,1))
nfIO act = rnf `fmap` act
#endif