@@ -1,212 +1,100 @@
1module Benchmark
1module Benchmark
4− , Suite (..)
2+ ( Suite
11− , bench3
6+ , Statistics
12− , bench4
7+ , statisticsToString
19−{-| A wrapper around benchmark.js that allows benchmarking
9+{-| A wrapper around benchmark.js that allows benchmarking of pure functions.
20−of pure functions to be evaluated.
22−# Error and Benchmark types
23−@docs Never, Benchmark, Suite, BenchStats
25−# Running benchmarks
11+# Creating Benchmarks
26−@docs run, runWithProgress
12+@docs Benchmark, bench, suite
28−# Creating benchmarks
14+# Run benchmarks
29−@docs bench, bench1, bench2, bench3, bench4, bench5, bench6, bench7, bench8, bench9
15+@docs run, Statistics
35import Native.Benchmark
19import Native.Benchmark
36import Native.BenchmarkJS
20import Native.BenchmarkJS
37−import Signal
21+import String
38−import Time
22+import Task
42−Our error return type: can never be instantiated
26+-- SET UP BENCHMARK SUITE
43−because running benchmarks should not fail
27+
50−Opaque type representing a function to be timed
57−The results of running a benchmark
63− , marginOfError : Float
65−-- , numRunsSampled : Int
70−A single or collection of benchmarks
29+{-| A set of benchmarks. -}
71−that can be run, generating output
30+type Benchmark
72−|-}
31+ = Test String Thunk
74− SingleBenchmark Benchmark
75 | Suite String (List Benchmark)
32 | Suite String (List Benchmark)
78−{-|
35+type Thunk = Thunk
79−Run a benchmark, generating a list of results for each benchmark.
36+
80−Results contain a pretty-printed string summary, and a list
37+
81−of detailed data for each benchmark.
38+{-| An individual benchmark with a name. It measures how long it takes to
82−|-}
39+evaluate the given function when it is passed a `()` value.
85− -> Task.Task Never (String, List BenchStats)
86−run = runWithProgress Nothing
90−Run a benchmark, generating a list of results for each benchmark
91−and updating a String signal with progress as the benchmarks run
94− : Maybe (Signal.Mailbox String)
96− -> Task.Task Never (String, List BenchStats)
97−runWithProgress maybeMailbox suite =
100− case maybeMailbox of
101− Nothing -> \_ -> Task.sleep 0
104− (Signal.send mailbox.address s
105− `Task.andThen` \_ -> Task.sleep (5*Time.second))
106− -- `Task.andThen` \_ -> Task.keepGoing
108− Native.Benchmark.runWithProgress ourTask suite
111−Create a benchmark with the given name
112−running an arbitrary thunk
114bench : String -> (() -> result) -> Benchmark
41bench : String -> (() -> result) -> Benchmark
115−bench = Native.Benchmark.makeBenchmark
43+ Test name (Native.Benchmark.makeThunk thunk)
118−{-|
46+{-| A collection of benchmarks to run together.
119−Functions for creating named benchmarks with 1 to 9 arguments
121−bench1 : String -> (a -> result) -> a -> Benchmark
48+suite : String -> List Benchmark -> Benchmark
122−bench1 name f a =
49+suite =
123− Native.Benchmark.makeBenchmark name (\_ -> f a)
50+ Suite
127−bench2 : String -> (a -> b -> result) -> a -> b -> Benchmark
54+-- RUN THE BENCHMARKS
128−bench2 name f a b =
55+
59+ = StatSuite String (List Statistics)
67+run : Benchmark -> Task.Task x Statistics
129− Native.Benchmark.makeBenchmark name (\_ -> f a b)
69+ Native.Benchmark.run
133−bench3 : String -> (a -> b -> c -> result) -> a -> b -> c -> Benchmark
73+-- TO STRING
134−bench3 name f a b c =
74+
135− Native.Benchmark.makeBenchmark name (\_ -> f a b c)
75+
136−
76+statisticsToString : Statistics -> String
137−
77+statisticsToString statistics =
138−{-||-}
78+ List.join "\n" (statisticsToStringHelp statistics)
139−bench4 : String -> (a -> b -> c -> d -> result) -> a -> b -> c -> d -> Benchmark
79+
140−bench4 name f a b c d =
80+
141− Native.Benchmark.makeBenchmark name (\_ -> f a b c d)
81+statisticsToStringHelp : Statistics -> (List String, Float)
142−
82+statisticsToStringHelp statistics =
143−
83+ case statistics of
144−{-||-}
84+ Result name {mean} ->
145−bench5 : String -> (a -> b -> c -> d -> e -> result) -> a -> b -> c -> d -> e -> Benchmark
85+ ( [ name ++ " - " ++ toString mean ]
146−bench5 name f a b c d e =
86+ , mean
147− Native.Benchmark.makeBenchmark name (\_ -> f a b c d e)
87+ )
149−
89+ StatSuite name subStats ->
151−bench6 :
91+ (strings, subMeans) =
152− String
92+ List.unzip (List.map statisticsToStringHelp subStats)
153− -> (a -> b -> c -> d -> e -> f -> result)
93+
155− -> b
95+ List.sum means
157− -> d
97+ ( name ++ " - " ++ toString total
158− -> e
98+ :: List.map (String.padLeft 4 ' ') (List.concat strings)
161−bench6 name fn a b c d e f =
162− Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f)
168− -> (a -> b -> c -> d -> e -> f -> g -> result)
177−bench7 name fn a b c d e f g =
178− Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f g)
184− -> (a -> b -> c -> d -> e -> f -> g -> h -> result)
194−bench8 name fn a b c d e f g h =
195− Native.Benchmark.makeBenchmark name (\_ -> fn a b c d e f g h)
200− -> (a -> b -> c -> d -> e -> f -> g -> h -> i -> result)
211−bench9 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)