@@ -1,14 +1,19 @@
1−{-# LANGUAGE OverloadedStrings #-}
1+{-# LANGUAGE BangPatterns, OverloadedStrings #-}
3import Criterion.Main
3import Criterion.Main
4+import Data.Text.Encoding
4import Data.Text.Search
5import Data.Text.Search
6+import qualified Data.ByteString.Char8 as B
5import qualified Data.Text as T
7import qualified Data.Text as T
8+import qualified SlowFunctions as Slow
7main = defaultMain [
10main = defaultMain [
8 bench "big/fast" $ (length . search indices)
11 bench "big/fast" $ (length . search indices)
9− , bench "big/slow" $ (length . search slowIndices)
12+ , bench "big/slow" $ (length . search Slow.indices)
13+ , bench "big/bytestring" $ (length . searchBS)
10 , bench "dna/fast" $ (length . searchDNA indices)
14 , bench "dna/fast" $ (length . searchDNA indices)
11− , bench "dna/slow" $ (length . searchDNA slowIndices)
15+ , bench "dna/slow" $ (length . searchDNA Slow.indices)
16+ , bench "dna/bytestring" $ (length . searchDNABS)
14search f n = f needle' haystack
19search f n = f needle' haystack
@@ -26,7 +31,38 @@ searchDNA f n = f needle haystack
26 needle = T.take 4 . T.drop (n `mod` (T.length dna - 4)) $ dna
31 needle = T.take 4 . T.drop (n `mod` (T.length dna - 4)) $ dna
27 haystack = T.replicate 100 dna
32 haystack = T.replicate 100 dna
29−dna = "\
34+replicateBS n = B.concat . replicate n
36+searchBS n = indicesBS needle' haystack
38+ needle' = B.drop (n `mod` 20) needle
39+ needle = replicateBS 10 "abcdefghijklmnopqrstuvwxyz"
40+ haystack = replicateBS 100 $
41+ B.concat [ replicateBS 1000 "def"
43+ , replicateBS 1000 "123"
46+searchDNABS n = indicesBS needle haystack
48+ needle = B.take 4 . B.drop (n `mod` (B.length bdna - 4)) $ bdna
49+ haystack = replicateBS 100 bdna
51+indicesBS :: B.ByteString -> B.ByteString -> [Int]
53+ | B.null pat = error "empty"
57+ go !i src = case B.breakSubstring pat src of
58+ (h,t) | B.null t -> []
59+ | otherwise -> i' : go (i'+l) (B.drop l t)
60+ where i' = i + B.length h
62+dna = decodeASCII bdna
30\CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGGGTT\
66\CGTAACAAGGTTTCCGTAGGTGAACCTGCGGAAGGATCATTGTTGAGATCACATAATAATTGATCGGGTT\
31\AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAATTGCCATCG\
67\AATCTGGAGGATCTGTTTACTTTGGTCACCCATGAGCATTTGCTGTTGAAGTGACCTAGAATTGCCATCG\
32\AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCTCCAAGTCGTT\
68\AGCCTCCTTGGGAGCTTTCTTGTTGGCGAGATCTAAACCCTTGCCCGGCGCAGTTTTGCTCCAAGTCGTT\