|
import qualified Data.Bits as Bit |
|
import qualified Data.ByteString as B |
|
import qualified Data.ByteString.Unsafe as B |
|
import qualified Data.Vector as VB |
|
import qualified Data.Vector.Generic as V |
|
import qualified Data.Vector.Unboxed as VU |
|
import qualified Data.Word as W |
|
import qualified Gauge.Main as G |
|
import qualified System.Random.MWC as R |
|
|
|
main :: IO () |
|
main = do |
|
let size = 2097152 :: Int |
|
vb8 <- R.withSystemRandom (R.asGenST (\ generator -> |
|
R.uniformVector generator size)) |
|
let |
|
vbb = mk_vbb vb8 |
|
vb16 = mk_vb16 vb8 |
|
vb32 = mk_vb32 vb8 |
|
vb64 = mk_vb64 vb8 |
|
vub = mk_vub vb8 |
|
vu8 = mk_vu8 vb8 |
|
vu16 = mk_vu16 vb8 |
|
vu32 = mk_vu32 vb8 |
|
vu64 = mk_vu64 vb8 |
|
b = mk_b vb8 |
|
|
|
print size |
|
G.defaultMain |
|
[ G.bench "ByteString" (G.nf f_b b) |
|
, G.bench "Vector Bool (boxed)" (G.nf f_vbb vbb) |
|
, G.bench "Vector Word8 (boxed)" (G.nf f_vb8 vb8) |
|
, G.bench "Vector Word16 (boxed)" (G.nf f_vb16 vb16) |
|
, G.bench "Vector Word32 (boxed)" (G.nf f_vb32 vb32) |
|
, G.bench "Vector Word64 (boxed)" (G.nf f_vb64 vb64) |
|
, G.bench "Vector Bool (unboxed)" (G.nf f_vub vub) |
|
, G.bench "Vector Word8 (unboxed)" (G.nf f_vu8 vu8) |
|
, G.bench "Vector Word16 (unboxed)" (G.nf f_vu16 vu16) |
|
, G.bench "Vector Word32 (unboxed)" (G.nf f_vu32 vu32) |
|
, G.bench "Vector Word64 (unboxed)" (G.nf f_vu64 vu64) |
|
] |
|
|
|
-- ByteString |
|
|
|
mk_b :: VB.Vector W.Word8 -> B.ByteString |
|
mk_b v = B.pack (V.toList v) |
|
|
|
f_b :: B.ByteString -> Int |
|
f_b b = foldr |
|
(\ i x -> if bit_b b i then x + 1 else x - 1) |
|
0 |
|
[0 .. 8 * B.length b - 1] |
|
|
|
bit_b :: B.ByteString -> Int -> Bool |
|
bit_b b i = let |
|
(q, r) = quotRem i 8 |
|
x = B.unsafeIndex b q |
|
in Bit.testBit x r |
|
|
|
-- Vector Bool (boxed) |
|
|
|
mk_vbb :: VB.Vector W.Word8 -> VB.Vector Bool |
|
mk_vbb v = V.fromList (map (bit_vb8 v) [0 .. 8 * V.length v - 1]) |
|
|
|
f_vbb :: VB.Vector Bool -> Int |
|
f_vbb v = foldr |
|
(\ i x -> if bit_vbb v i then x + 1 else x - 1) |
|
0 |
|
[0 .. V.length v - 1] |
|
|
|
bit_vbb :: VB.Vector Bool -> Int -> Bool |
|
bit_vbb = V.unsafeIndex |
|
|
|
-- Vector Bool (unboxed) |
|
|
|
mk_vub :: VB.Vector W.Word8 -> VU.Vector Bool |
|
mk_vub v = V.fromList (map (bit_vb8 v) [0 .. 8 * V.length v - 1]) |
|
|
|
f_vub :: VU.Vector Bool -> Int |
|
f_vub v = foldr |
|
(\ i x -> if bit_vub v i then x + 1 else x - 1) |
|
0 |
|
[0 .. V.length v - 1] |
|
|
|
bit_vub :: VU.Vector Bool -> Int -> Bool |
|
bit_vub = V.unsafeIndex |
|
|
|
-- Vector Word8 (boxed) |
|
|
|
f_vb8 :: VB.Vector W.Word8 -> Int |
|
f_vb8 v = foldr |
|
(\ i x -> if bit_vb8 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 8 * V.length v - 1] |
|
|
|
bit_vb8 :: VB.Vector W.Word8 -> Int -> Bool |
|
bit_vb8 v i = let |
|
(q, r) = quotRem i 8 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word8 (unboxed) |
|
|
|
mk_vu8 :: VB.Vector W.Word8 -> VU.Vector W.Word8 |
|
mk_vu8 = V.convert |
|
|
|
f_vu8 :: VU.Vector W.Word8 -> Int |
|
f_vu8 v = foldr |
|
(\ i x -> if bit_vu8 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 8 * V.length v - 1] |
|
|
|
bit_vu8 :: VU.Vector W.Word8 -> Int -> Bool |
|
bit_vu8 v i = let |
|
(q, r) = quotRem i 8 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word16 (boxed) |
|
|
|
mk_vb16 :: VB.Vector W.Word8 -> VB.Vector W.Word16 |
|
mk_vb16 v = V.fromList (map |
|
(\ i -> let |
|
x = V.unsafeIndex v i |
|
y = V.unsafeIndex v (i + 1) |
|
in w8_16 y Bit..|. (Bit.unsafeShiftL (w8_16 x) 8)) |
|
[0, 2 .. V.length v - 1]) |
|
|
|
f_vb16 :: VB.Vector W.Word16 -> Int |
|
f_vb16 v = foldr |
|
(\ i x -> if bit_vb16 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 16 * V.length v - 1] |
|
|
|
bit_vb16 :: VB.Vector W.Word16 -> Int -> Bool |
|
bit_vb16 v i = let |
|
(q, r) = quotRem i 16 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word16 (unboxed) |
|
|
|
mk_vu16 :: VB.Vector W.Word8 -> VU.Vector W.Word16 |
|
mk_vu16 v = V.fromList (map |
|
(\ i -> let |
|
x = V.unsafeIndex v i |
|
y = V.unsafeIndex v (i + 1) |
|
in w8_16 y Bit..|. (Bit.unsafeShiftL (w8_16 x) 8)) |
|
[0, 2 .. V.length v - 1]) |
|
|
|
f_vu16 :: VU.Vector W.Word16 -> Int |
|
f_vu16 v = foldr |
|
(\ i x -> if bit_vu16 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 16 * V.length v - 1] |
|
|
|
bit_vu16 :: VU.Vector W.Word16 -> Int -> Bool |
|
bit_vu16 v i = let |
|
(q, r) = quotRem i 16 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word32 (boxed) |
|
|
|
mk_vb32 :: VB.Vector W.Word8 -> VB.Vector W.Word32 |
|
mk_vb32 v = V.fromList (map |
|
(\ i -> let |
|
a = V.unsafeIndex v i |
|
b = V.unsafeIndex v (i + 1) |
|
c = V.unsafeIndex v (i + 2) |
|
d = V.unsafeIndex v (i + 3) |
|
in w8_32 d |
|
Bit..|. (Bit.unsafeShiftL (w8_32 c) 8) |
|
Bit..|. (Bit.unsafeShiftL (w8_32 b) 16) |
|
Bit..|. (Bit.unsafeShiftL (w8_32 a) 24)) |
|
[0, 4 .. V.length v - 1]) |
|
|
|
f_vb32 :: VB.Vector W.Word32 -> Int |
|
f_vb32 v = foldr |
|
(\ i x -> if bit_vb32 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 32 * V.length v - 1] |
|
|
|
bit_vb32 :: VB.Vector W.Word32 -> Int -> Bool |
|
bit_vb32 v i = let |
|
(q, r) = quotRem i 32 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word32 (unboxed) |
|
|
|
mk_vu32 :: VB.Vector W.Word8 -> VU.Vector W.Word32 |
|
mk_vu32 v = V.fromList (map |
|
(\ i -> let |
|
a = V.unsafeIndex v i |
|
b = V.unsafeIndex v (i + 1) |
|
c = V.unsafeIndex v (i + 2) |
|
d = V.unsafeIndex v (i + 3) |
|
in w8_32 d |
|
Bit..|. (Bit.unsafeShiftL (w8_32 c) 8) |
|
Bit..|. (Bit.unsafeShiftL (w8_32 b) 16) |
|
Bit..|. (Bit.unsafeShiftL (w8_32 a) 24)) |
|
[0, 4 .. V.length v - 1]) |
|
|
|
f_vu32 :: VU.Vector W.Word32 -> Int |
|
f_vu32 v = foldr |
|
(\ i x -> if bit_vu32 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 32 * V.length v - 1] |
|
|
|
bit_vu32 :: VU.Vector W.Word32 -> Int -> Bool |
|
bit_vu32 v i = let |
|
(q, r) = quotRem i 32 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word64 (boxed) |
|
|
|
mk_vb64 :: VB.Vector W.Word8 -> VB.Vector W.Word64 |
|
mk_vb64 v = V.fromList (map |
|
(\ i -> let |
|
a = V.unsafeIndex v i |
|
b = V.unsafeIndex v (i + 1) |
|
c = V.unsafeIndex v (i + 2) |
|
d = V.unsafeIndex v (i + 3) |
|
e = V.unsafeIndex v (i + 4) |
|
f = V.unsafeIndex v (i + 5) |
|
g = V.unsafeIndex v (i + 6) |
|
h = V.unsafeIndex v (i + 7) |
|
in w8_64 h |
|
Bit..|. (Bit.unsafeShiftL (w8_64 g) 8) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 f) 16) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 e) 24) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 d) 32) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 c) 40) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 b) 48) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 a) 56)) |
|
[0, 8 .. V.length v - 1]) |
|
|
|
f_vb64 :: VB.Vector W.Word64 -> Int |
|
f_vb64 v = foldr |
|
(\ i x -> if bit_vb64 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 64 * V.length v - 1] |
|
|
|
bit_vb64 :: VB.Vector W.Word64 -> Int -> Bool |
|
bit_vb64 v i = let |
|
(q, r) = quotRem i 64 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- Vector Word64 (unboxed) |
|
|
|
mk_vu64 :: VB.Vector W.Word8 -> VU.Vector W.Word64 |
|
mk_vu64 v = V.fromList (map |
|
(\ i -> let |
|
a = V.unsafeIndex v i |
|
b = V.unsafeIndex v (i + 1) |
|
c = V.unsafeIndex v (i + 2) |
|
d = V.unsafeIndex v (i + 3) |
|
e = V.unsafeIndex v (i + 4) |
|
f = V.unsafeIndex v (i + 5) |
|
g = V.unsafeIndex v (i + 6) |
|
h = V.unsafeIndex v (i + 7) |
|
in w8_64 h |
|
Bit..|. (Bit.unsafeShiftL (w8_64 g) 8) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 f) 16) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 e) 24) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 d) 32) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 c) 40) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 b) 48) |
|
Bit..|. (Bit.unsafeShiftL (w8_64 a) 56)) |
|
[0, 8 .. V.length v - 1]) |
|
|
|
f_vu64 :: VU.Vector W.Word64 -> Int |
|
f_vu64 v = foldr |
|
(\ i x -> if bit_vu64 v i then x + 1 else x - 1) |
|
0 |
|
[0 .. 64 * V.length v - 1] |
|
|
|
bit_vu64 :: VU.Vector W.Word64 -> Int -> Bool |
|
bit_vu64 v i = let |
|
(q, r) = quotRem i 64 |
|
x = V.unsafeIndex v q |
|
in Bit.testBit x r |
|
|
|
-- misc |
|
|
|
w8_16 :: W.Word8 -> W.Word16 |
|
w8_16 = fromIntegral |
|
|
|
w8_32 :: W.Word8 -> W.Word32 |
|
w8_32 = fromIntegral |
|
|
|
w8_64 :: W.Word8 -> W.Word64 |
|
w8_64 = fromIntegral |