on ff98144 help sign in
elk/bench/src/Benchmark.elm
212 lines 4.2 kB history raw
1module Benchmark
2 ( Never
3 , Benchmark
4 , Suite (..)
5 , BenchStats
6 , run
7 , runWithProgress
8 , bench
9 , bench1
10 , bench2
11 , bench3
12 , bench4
13 , bench5
14 , bench6
15 , bench7
16 , bench8
17 , bench9
18 )where
19{-| A wrapper around benchmark.js that allows benchmarking
20of pure functions to be evaluated.
22# Error and Benchmark types
23@docs Never, Benchmark, Suite, BenchStats
25# Running benchmarks
26@docs run, runWithProgress
28# Creating benchmarks
29@docs bench, bench1, bench2, bench3, bench4, bench5, bench6, bench7, bench8, bench9
30-}
33import Task
34import String
35import Native.Benchmark
36import Native.BenchmarkJS
37import Signal
38import Time
41{-|
42Our error return type: can never be instantiated
43because running benchmarks should not fail
44|-}
45type Never =
46 Never Never
49{-|
50Opaque type representing a function to be timed
51|-}
52type Benchmark =
53 Benchmark
56{-|
57The results of running a benchmark
58|-}
59type BenchStats =
60 BenchStats
61 { name : String
62 , hz : Float
63 , marginOfError : Float
64 , moePercent : Float
65-- , numRunsSampled : Int
66 }
69{-|
70A single or collection of benchmarks
71that can be run, generating output
72|-}
73type Suite =
74 SingleBenchmark Benchmark
75 | Suite String (List Benchmark)
78{-|
79Run a benchmark, generating a list of results for each benchmark.
80Results contain a pretty-printed string summary, and a list
81of detailed data for each benchmark.
82|-}
83run
84 : Suite
85 -> Task.Task Never (String, List BenchStats)
86run = runWithProgress Nothing
89{-|
90Run a benchmark, generating a list of results for each benchmark
91and updating a String signal with progress as the benchmarks run
92|-}
93runWithProgress
94 : Maybe (Signal.Mailbox String)
95 -> Suite
96 -> Task.Task Never (String, List BenchStats)
97runWithProgress maybeMailbox suite =
98 let
99 ourTask =
100 case maybeMailbox of
101 Nothing -> \_ -> Task.sleep 0
102 Just mailbox ->
103 \s ->
104 (Signal.send mailbox.address s
105 `Task.andThen` \_ -> Task.sleep (5*Time.second))
106 -- `Task.andThen` \_ -> Task.keepGoing
107 in
108 Native.Benchmark.runWithProgress ourTask suite
110{-|
111Create a benchmark with the given name
112running an arbitrary thunk
113|-}
114bench : String -> (() -> result) -> Benchmark
115bench = Native.Benchmark.makeBenchmark
118{-|
119Functions for creating named benchmarks with 1 to 9 arguments
120|-}
121bench1 : String -> (a -> result) -> a -> Benchmark
122bench1 name f a =
123 Native.Benchmark.makeBenchmark name (\_ -> f a)
126{-||-}
127bench2 : String -> (a -> b -> result) -> a -> b -> Benchmark
128bench2 name f a b =
129 Native.Benchmark.makeBenchmark name (\_ -> f a b)
132{-||-}
133bench3 : String -> (a -> b -> c -> result) -> a -> b -> c -> Benchmark
134bench3 name f a b c =
135 Native.Benchmark.makeBenchmark name (\_ -> f a b c)
138{-||-}
139bench4 : String -> (a -> b -> c -> d -> result) -> a -> b -> c -> d -> Benchmark
140bench4 name f a b c d =
141 Native.Benchmark.makeBenchmark name (\_ -> f a b c d)
144{-||-}
145bench5 : String -> (a -> b -> c -> d -> e -> result) -> a -> b -> c -> d -> e -> Benchmark
146bench5 name f a b c d e =
147 Native.Benchmark.makeBenchmark name (\_ -> f a b c d e)
150{-||-}
151bench6 :
152 String
153 -> (a -> b -> c -> d -> e -> f -> result)
154 -> a
155 -> b
156 -> c
157 -> d
158 -> e
159 -> f
160 -> Benchmark
161bench6 name fn a b c d e f =
162 Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f)
165{-||-}
166bench7 :
167 String
168 -> (a -> b -> c -> d -> e -> f -> g -> result)
169 -> a
170 -> b
171 -> c
172 -> d
173 -> e
174 -> f
175 -> g
176 -> Benchmark
177bench7 name fn a b c d e f g =
178 Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f g)
181{-||-}
182bench8 :
183 String
184 -> (a -> b -> c -> d -> e -> f -> g -> h -> result)
185 -> a
186 -> b
187 -> c
188 -> d
189 -> e
190 -> f
191 -> g
192 -> h
193 -> Benchmark
194bench8 name fn a b c d e f g h =
195 Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f g h)
197{-||-}
198bench9 :
199 String
200 -> (a -> b -> c -> d -> e -> f -> g -> h -> i -> result)
201 -> a
202 -> b
203 -> c
204 -> d
205 -> e
206 -> f
207 -> g
208 -> h
209 -> i
210 -> Benchmark
211bench9 name fn a b c d e f g h i =
212 Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f g h i)