summaryrefslogtreecommitdiff
path: root/test/bench.hs
diff options
context:
space:
mode:
Diffstat (limited to 'test/bench.hs')
-rw-r--r--test/bench.hs82
1 files changed, 82 insertions, 0 deletions
diff --git a/test/bench.hs b/test/bench.hs
new file mode 100644
index 0000000..9952ec2
--- /dev/null
+++ b/test/bench.hs
@@ -0,0 +1,82 @@
1{-# LANGUAGE ForeignFunctionInterface #-}
2import qualified Data.Attoparsec.Text as Atto
3import qualified Data.ByteString.Char8 as S
4import qualified Data.ByteString.Lazy.Char8 as L
5import Data.List as List
6import Data.Either
7import Data.ByteString.Unsafe
8import Data.Text
9import Data.Text.Encoding
10import Data.Word
11import Foreign.Ptr
12import System.IO.Unsafe
13import qualified Data.Vector as V
14import Control.Monad.State ( State, execState, gets, modify )
15import qualified Data.IntMap as IntMap
16
17import Codec.Wavefront.Lexer ( lexer )
18import Codec.Wavefront.Object ( WavefrontOBJ, ctxtToWavefrontOBJ, objLocations )
19import Codec.Wavefront.Token ( tokenize )
20
21import qualified Graphics.WaveFront.Parse as Parse
22import qualified Graphics.WaveFront.Parse.Common as Parse
23
24import Wavefront
25
26import Criterion.Main
27import Weigh -- WARNING: weigh is incompatible with profiling. It reports much more allocations with profiling turned on.
28
29foreign import ccall "&cube_obj" cube_ptr :: Ptr Word8
30cube_obj_len :: Int
31cube_obj_len = 840
32
33cube_obj :: L.ByteString
34cube_obj = L.fromChunks . pure . unsafePerformIO $ do
35 unsafePackCStringFinalizer cube_ptr cube_obj_len (return ())
36{-# NOINLINE cube_obj #-}
37
38cube_objT :: Text
39cube_objT = decodeASCII $ L.toStrict cube_obj
40{-# NOINLINE cube_objT #-}
41
42countVerticesSabadie :: Text -> Int
43countVerticesSabadie ts = V.length vs
44 where
45 obj = sabadie ts
46 vs = either (const V.empty) objLocations obj
47
48countVerticesSundqvist :: Text -> Int
49countVerticesSundqvist ts = List.length vs
50 where
51 obj = sundqvist ts
52 vs = either (const []) (List.filter isOBJVertex) obj
53 isOBJVertex (Parse.OBJVertex {}) = True
54 isOBJVertex _ = False
55
56countVerticesCrayne :: L.ByteString -> Int
57countVerticesCrayne bs = execState (parseOBJ builder (ObjConfig IntMap.empty) bs) 0
58 where
59 builder = nullBuilder
60 { vertex = \_ -> modify succ
61 }
62
63sabadie :: Text -> Either String WavefrontOBJ
64sabadie = fmap (ctxtToWavefrontOBJ . lexer) . tokenize
65
66sundqvist :: Text -> Either String (Parse.OBJ Double Text Integer [])
67sundqvist = Atto.parseOnly (Parse.wholeFile Parse.obj)
68
69main :: IO ()
70main = do
71 print $ countVerticesSabadie cube_objT
72 print $ countVerticesSundqvist cube_objT
73 print $ countVerticesCrayne cube_obj
74 putStrLn $ "---- Benchmarking"
75 defaultMain [
76 bgroup "count vertices"
77 [ bench "crayne" $ whnf countVerticesCrayne cube_obj
78 , bench "sabadie" $ whnf countVerticesSabadie cube_objT
79 , bench "sundqvist" $ whnf countVerticesSundqvist cube_objT
80 ]
81 ]
82 return ()