11
import Control.Exception
20
[ test wordSize chunkSize mb
21
| wordSize <- [1,2,4,8]
22
, chunkSize <- [1,2,4,8,16] ]
24
time :: IO a -> IO Double
29
return $! (fromIntegral (end - start)) / (10^12)
31
test :: Int -> Int -> Int -> IO ()
32
test wordSize chunkSize mb = do
35
iterations = bytes `div` wordSize
36
putStr $ show mb ++ "MB of Word" ++ show (8 * wordSize)
37
++ " in chunks of " ++ show chunkSize ++ ": "
38
h <- openBinMem bytes undefined
40
putSeconds <- time $ do
41
doPut wordSize chunkSize h iterations
42
-- BinPtr n _ <- tellBin h
44
getSeconds <- time $ do
46
sum <- doGet wordSize chunkSize h iterations
48
-- BinPtr n _ <- tellBin h
50
let putThroughput = fromIntegral mb / putSeconds
51
getThroughput = fromIntegral mb / getSeconds
52
putStrLn $ showFFloat (Just 2) putThroughput "MB/s write, "
53
++ showFFloat (Just 2) getThroughput "MB/s read"
55
doPut :: Int -> Int -> BinHandle -> Int -> IO ()
56
doPut wordSize chunkSize =
57
case (wordSize, chunkSize) of
62
(1, 16) -> putWord8N16
67
(2, 16) -> putWord16N16
72
(4, 16) -> putWord32N16
77
(8, 16) -> putWord64N16
79
putWord8 :: BinHandle -> Word8 -> IO ()
81
{-# INLINE putWord8 #-}
83
putWord16be :: BinHandle -> Word16 -> IO ()
85
{-# INLINE putWord16be #-}
87
putWord32be :: BinHandle -> Word32 -> IO ()
89
{-# INLINE putWord32be #-}
91
putWord64be :: BinHandle -> Word64 -> IO ()
93
{-# INLINE putWord64be #-}
95
getWord8 :: BinHandle -> IO Word8
97
{-# INLINE getWord8 #-}
99
getWord16be :: BinHandle -> IO Word16
101
{-# INLINE getWord16be #-}
103
getWord32be :: BinHandle -> IO Word32
105
{-# INLINE getWord32be #-}
107
getWord64be :: BinHandle -> IO Word64
109
{-# INLINE getWord64be #-}
111
putWord8N1 hnd = loop 0
112
where loop s n | s `seq` n `seq` False = undefined
118
putWord8N2 hnd = loop 0
119
where loop s n | s `seq` n `seq` False = undefined
126
putWord8N4 hnd = loop 0
127
where loop s n | s `seq` n `seq` False = undefined
136
putWord8N8 hnd = loop 0
137
where loop s n | s `seq` n `seq` False = undefined
150
putWord8N16 hnd = loop 0
151
where loop s n | s `seq` n `seq` False = undefined
173
putWord16N1 hnd = loop 0
174
where loop s n | s `seq` n `seq` False = undefined
177
putWord16be hnd (s+0)
180
putWord16N2 hnd = loop 0
181
where loop s n | s `seq` n `seq` False = undefined
184
putWord16be hnd (s+0)
185
putWord16be hnd (s+1)
188
putWord16N4 hnd = loop 0
189
where loop s n | s `seq` n `seq` False = undefined
192
putWord16be hnd (s+0)
193
putWord16be hnd (s+1)
194
putWord16be hnd (s+2)
195
putWord16be hnd (s+3)
198
putWord16N8 hnd = loop 0
199
where loop s n | s `seq` n `seq` False = undefined
202
putWord16be hnd (s+0)
203
putWord16be hnd (s+1)
204
putWord16be hnd (s+2)
205
putWord16be hnd (s+3)
206
putWord16be hnd (s+4)
207
putWord16be hnd (s+5)
208
putWord16be hnd (s+6)
209
putWord16be hnd (s+7)
212
putWord16N16 hnd = loop 0
213
where loop s n | s `seq` n `seq` False = undefined
216
putWord16be hnd (s+0)
217
putWord16be hnd (s+1)
218
putWord16be hnd (s+2)
219
putWord16be hnd (s+3)
220
putWord16be hnd (s+4)
221
putWord16be hnd (s+5)
222
putWord16be hnd (s+6)
223
putWord16be hnd (s+7)
224
putWord16be hnd (s+8)
225
putWord16be hnd (s+9)
226
putWord16be hnd (s+10)
227
putWord16be hnd (s+11)
228
putWord16be hnd (s+12)
229
putWord16be hnd (s+13)
230
putWord16be hnd (s+14)
231
putWord16be hnd (s+15)
235
putWord32N1 hnd = loop 0
236
where loop s n | s `seq` n `seq` False = undefined
239
putWord32be hnd (s+0)
242
putWord32N2 hnd = loop 0
243
where loop s n | s `seq` n `seq` False = undefined
246
putWord32be hnd (s+0)
247
putWord32be hnd (s+1)
250
putWord32N4 hnd = loop 0
251
where loop s n | s `seq` n `seq` False = undefined
254
putWord32be hnd (s+0)
255
putWord32be hnd (s+1)
256
putWord32be hnd (s+2)
257
putWord32be hnd (s+3)
260
putWord32N8 hnd = loop 0
261
where loop s n | s `seq` n `seq` False = undefined
264
putWord32be hnd (s+0)
265
putWord32be hnd (s+1)
266
putWord32be hnd (s+2)
267
putWord32be hnd (s+3)
268
putWord32be hnd (s+4)
269
putWord32be hnd (s+5)
270
putWord32be hnd (s+6)
271
putWord32be hnd (s+7)
274
putWord32N16 hnd = loop 0
275
where loop s n | s `seq` n `seq` False = undefined
278
putWord32be hnd (s+0)
279
putWord32be hnd (s+1)
280
putWord32be hnd (s+2)
281
putWord32be hnd (s+3)
282
putWord32be hnd (s+4)
283
putWord32be hnd (s+5)
284
putWord32be hnd (s+6)
285
putWord32be hnd (s+7)
286
putWord32be hnd (s+8)
287
putWord32be hnd (s+9)
288
putWord32be hnd (s+10)
289
putWord32be hnd (s+11)
290
putWord32be hnd (s+12)
291
putWord32be hnd (s+13)
292
putWord32be hnd (s+14)
293
putWord32be hnd (s+15)
296
putWord64N1 hnd = loop 0
297
where loop s n | s `seq` n `seq` False = undefined
300
putWord64be hnd (s+0)
303
putWord64N2 hnd = loop 0
304
where loop s n | s `seq` n `seq` False = undefined
307
putWord64be hnd (s+0)
308
putWord64be hnd (s+1)
311
putWord64N4 hnd = loop 0
312
where loop s n | s `seq` n `seq` False = undefined
315
putWord64be hnd (s+0)
316
putWord64be hnd (s+1)
317
putWord64be hnd (s+2)
318
putWord64be hnd (s+3)
321
putWord64N8 hnd = loop 0
322
where loop s n | s `seq` n `seq` False = undefined
325
putWord64be hnd (s+0)
326
putWord64be hnd (s+1)
327
putWord64be hnd (s+2)
328
putWord64be hnd (s+3)
329
putWord64be hnd (s+4)
330
putWord64be hnd (s+5)
331
putWord64be hnd (s+6)
332
putWord64be hnd (s+7)
335
putWord64N16 hnd = loop 0
336
where loop s n | s `seq` n `seq` False = undefined
339
putWord64be hnd (s+0)
340
putWord64be hnd (s+1)
341
putWord64be hnd (s+2)
342
putWord64be hnd (s+3)
343
putWord64be hnd (s+4)
344
putWord64be hnd (s+5)
345
putWord64be hnd (s+6)
346
putWord64be hnd (s+7)
347
putWord64be hnd (s+8)
348
putWord64be hnd (s+9)
349
putWord64be hnd (s+10)
350
putWord64be hnd (s+11)
351
putWord64be hnd (s+12)
352
putWord64be hnd (s+13)
353
putWord64be hnd (s+14)
354
putWord64be hnd (s+15)
357
doGet :: Int -> Int -> BinHandle -> Int -> IO Int
358
doGet wordSize chunkSize hnd =
359
case (wordSize, chunkSize) of
360
(1, 1) -> fmap fromIntegral . getWord8N1 hnd
361
(1, 2) -> fmap fromIntegral . getWord8N2 hnd
362
(1, 4) -> fmap fromIntegral . getWord8N4 hnd
363
(1, 8) -> fmap fromIntegral . getWord8N8 hnd
364
(1, 16) -> fmap fromIntegral . getWord8N16 hnd
365
(2, 1) -> fmap fromIntegral . getWord16N1 hnd
366
(2, 2) -> fmap fromIntegral . getWord16N2 hnd
367
(2, 4) -> fmap fromIntegral . getWord16N4 hnd
368
(2, 8) -> fmap fromIntegral . getWord16N8 hnd
369
(2, 16) -> fmap fromIntegral . getWord16N16 hnd
370
(4, 1) -> fmap fromIntegral . getWord32N1 hnd
371
(4, 2) -> fmap fromIntegral . getWord32N2 hnd
372
(4, 4) -> fmap fromIntegral . getWord32N4 hnd
373
(4, 8) -> fmap fromIntegral . getWord32N8 hnd
374
(4, 16) -> fmap fromIntegral . getWord32N16 hnd
375
(8, 1) -> fmap fromIntegral . getWord64N1 hnd
376
(8, 2) -> fmap fromIntegral . getWord64N2 hnd
377
(8, 4) -> fmap fromIntegral . getWord64N4 hnd
378
(8, 8) -> fmap fromIntegral . getWord64N8 hnd
379
(8, 16) -> fmap fromIntegral . getWord64N16 hnd
381
getWord8N1 hnd = loop 0
382
where loop s n | s `seq` n `seq` False = undefined
388
getWord8N2 hnd = loop 0
389
where loop s n | s `seq` n `seq` False = undefined
396
getWord8N4 hnd = loop 0
397
where loop s n | s `seq` n `seq` False = undefined
404
loop (s+s0+s1+s2+s3) (n-4)
406
getWord8N8 hnd = loop 0
407
where loop s n | s `seq` n `seq` False = undefined
418
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
420
getWord8N16 hnd = loop 0
421
where loop s n | s `seq` n `seq` False = undefined
440
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
443
getWord16N1 hnd = loop 0
444
where loop s n | s `seq` n `seq` False = undefined
447
s0 <- getWord16be hnd
450
getWord16N2 hnd = loop 0
451
where loop s n | s `seq` n `seq` False = undefined
454
s0 <- getWord16be hnd
455
s1 <- getWord16be hnd
458
getWord16N4 hnd = loop 0
459
where loop s n | s `seq` n `seq` False = undefined
462
s0 <- getWord16be hnd
463
s1 <- getWord16be hnd
464
s2 <- getWord16be hnd
465
s3 <- getWord16be hnd
466
loop (s+s0+s1+s2+s3) (n-4)
468
getWord16N8 hnd = loop 0
469
where loop s n | s `seq` n `seq` False = undefined
472
s0 <- getWord16be hnd
473
s1 <- getWord16be hnd
474
s2 <- getWord16be hnd
475
s3 <- getWord16be hnd
476
s4 <- getWord16be hnd
477
s5 <- getWord16be hnd
478
s6 <- getWord16be hnd
479
s7 <- getWord16be hnd
480
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
482
getWord16N16 hnd = loop 0
483
where loop s n | s `seq` n `seq` False = undefined
486
s0 <- getWord16be hnd
487
s1 <- getWord16be hnd
488
s2 <- getWord16be hnd
489
s3 <- getWord16be hnd
490
s4 <- getWord16be hnd
491
s5 <- getWord16be hnd
492
s6 <- getWord16be hnd
493
s7 <- getWord16be hnd
494
s8 <- getWord16be hnd
495
s9 <- getWord16be hnd
496
s10 <- getWord16be hnd
497
s11 <- getWord16be hnd
498
s12 <- getWord16be hnd
499
s13 <- getWord16be hnd
500
s14 <- getWord16be hnd
501
s15 <- getWord16be hnd
502
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
505
getWord32N1 hnd = loop 0
506
where loop s n | s `seq` n `seq` False = undefined
509
s0 <- getWord32be hnd
512
getWord32N2 hnd = loop 0
513
where loop s n | s `seq` n `seq` False = undefined
516
s0 <- getWord32be hnd
517
s1 <- getWord32be hnd
520
getWord32N4 hnd = loop 0
521
where loop s n | s `seq` n `seq` False = undefined
524
s0 <- getWord32be hnd
525
s1 <- getWord32be hnd
526
s2 <- getWord32be hnd
527
s3 <- getWord32be hnd
528
loop (s+s0+s1+s2+s3) (n-4)
530
getWord32N8 hnd = loop 0
531
where loop s n | s `seq` n `seq` False = undefined
534
s0 <- getWord32be hnd
535
s1 <- getWord32be hnd
536
s2 <- getWord32be hnd
537
s3 <- getWord32be hnd
538
s4 <- getWord32be hnd
539
s5 <- getWord32be hnd
540
s6 <- getWord32be hnd
541
s7 <- getWord32be hnd
542
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
544
getWord32N16 hnd = loop 0
545
where loop s n | s `seq` n `seq` False = undefined
548
s0 <- getWord32be hnd
549
s1 <- getWord32be hnd
550
s2 <- getWord32be hnd
551
s3 <- getWord32be hnd
552
s4 <- getWord32be hnd
553
s5 <- getWord32be hnd
554
s6 <- getWord32be hnd
555
s7 <- getWord32be hnd
556
s8 <- getWord32be hnd
557
s9 <- getWord32be hnd
558
s10 <- getWord32be hnd
559
s11 <- getWord32be hnd
560
s12 <- getWord32be hnd
561
s13 <- getWord32be hnd
562
s14 <- getWord32be hnd
563
s15 <- getWord32be hnd
564
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)
566
getWord64N1 hnd = loop 0
567
where loop s n | s `seq` n `seq` False = undefined
570
s0 <- getWord64be hnd
573
getWord64N2 hnd = loop 0
574
where loop s n | s `seq` n `seq` False = undefined
577
s0 <- getWord64be hnd
578
s1 <- getWord64be hnd
581
getWord64N4 hnd = loop 0
582
where loop s n | s `seq` n `seq` False = undefined
585
s0 <- getWord64be hnd
586
s1 <- getWord64be hnd
587
s2 <- getWord64be hnd
588
s3 <- getWord64be hnd
589
loop (s+s0+s1+s2+s3) (n-4)
591
getWord64N8 hnd = loop 0
592
where loop s n | s `seq` n `seq` False = undefined
595
s0 <- getWord64be hnd
596
s1 <- getWord64be hnd
597
s2 <- getWord64be hnd
598
s3 <- getWord64be hnd
599
s4 <- getWord64be hnd
600
s5 <- getWord64be hnd
601
s6 <- getWord64be hnd
602
s7 <- getWord64be hnd
603
loop (s+s0+s1+s2+s3+s4+s5+s6+s7) (n-8)
605
getWord64N16 hnd = loop 0
606
where loop s n | s `seq` n `seq` False = undefined
609
s0 <- getWord64be hnd
610
s1 <- getWord64be hnd
611
s2 <- getWord64be hnd
612
s3 <- getWord64be hnd
613
s4 <- getWord64be hnd
614
s5 <- getWord64be hnd
615
s6 <- getWord64be hnd
616
s7 <- getWord64be hnd
617
s8 <- getWord64be hnd
618
s9 <- getWord64be hnd
619
s10 <- getWord64be hnd
620
s11 <- getWord64be hnd
621
s12 <- getWord64be hnd
622
s13 <- getWord64be hnd
623
s14 <- getWord64be hnd
624
s15 <- getWord64be hnd
625
loop (s+s0+s1+s2+s3+s4+s5+s6+s7+s9+s10+s11+s12+s13+s14+s15) (n-16)