on master help sign in
Add updateN to benchmark fns
0d207d0jmite
bench/CompilerBenchmarks.elm+3−1
@@ -24,11 +24,13 @@ mySuite =
24 , Benchmark.bench1 "Array native foldl, 500 elems: " ArrayBench.foldlMeanStddev array500
24 , Benchmark.bench1 "Array native foldl, 500 elems: " ArrayBench.foldlMeanStddev array500
25 , Benchmark.bench1 "Array custom foldr, 500 elems: " ArrayBench.customFoldrMeanStddev array500
25 , Benchmark.bench1 "Array custom foldr, 500 elems: " ArrayBench.customFoldrMeanStddev array500
26 , Benchmark.bench1 "Array custom foldl, 500 elems: " ArrayBench.customFoldrMeanStddev array500
26 , Benchmark.bench1 "Array custom foldl, 500 elems: " ArrayBench.customFoldrMeanStddev array500
27+ , Benchmark.bench3 "Array square nth elem, 500 elems: " ArrayBench.updateNRandomIndices (\x -> x*x) indices200 array500
27
28
28 , Benchmark.bench1 "List native foldr, 500 elems: " ListBench.foldrMeanStddev list500
29 , Benchmark.bench1 "List native foldr, 500 elems: " ListBench.foldrMeanStddev list500
29 , Benchmark.bench1 "List native foldl, 500 elems: " ListBench.foldlMeanStddev list500
30 , Benchmark.bench1 "List native foldl, 500 elems: " ListBench.foldlMeanStddev list500
30 , Benchmark.bench1 "List custom foldr, 500 elems: " ListBench.customFoldrMeanStddev list500
31 , Benchmark.bench1 "List custom foldr, 500 elems: " ListBench.customFoldrMeanStddev list500
31 , Benchmark.bench1 "List custom foldl, 500 elems: " ListBench.customFoldrMeanStddev list500
32 , Benchmark.bench1 "List custom foldl, 500 elems: " ListBench.customFoldrMeanStddev list500
33+ , Benchmark.bench3 "List square nth elem, 500 elems: " ListBench.updateNRandomIndices (\x -> x*x) indices200 list500
32
34
33 , Benchmark.bench2 "200 lookups in array of 500 elems: " ArrayBench.randomLookups indices200 (Array.fromList [1 .. 500] )
35 , Benchmark.bench2 "200 lookups in array of 500 elems: " ArrayBench.randomLookups indices200 (Array.fromList [1 .. 500] )
34 , Benchmark.bench2 "200 lookups in list of 500 elems: " ListBench.randomLookups indices200 ([1 .. 500] )
36 , Benchmark.bench2 "200 lookups in list of 500 elems: " ListBench.randomLookups indices200 ([1 .. 500] )
@@ -52,7 +54,7 @@ port benchResults =
52
54
53--Our main page:
55--Our main page:
54main =
56main =
55− Signal.map2 (\s1 s2 -> Graphics.Element.leftAligned <| Text.fromString (s1 ++ " " ++ (toString s2) ) ) results.signal (Time.every Time.second)
57+ Signal.map (Graphics.Element.leftAligned << Text.fromString) results.signal
56
58
57
59
58
60
bench/src/ArrayBench.elm+18−1
@@ -2,6 +2,7 @@ module ArrayBench where
2
2
3import Array
3import Array
4import Random
4import Random
5+import Debug exposing (crash)
5
6
6
7
7
8
@@ -40,6 +41,16 @@ customFoldrMeanStddev = meanAndStddev myFoldr
40
41
41customFoldlMeanStddev = meanAndStddev myFoldl
42customFoldlMeanStddev = meanAndStddev myFoldl
42
43
44+updateNRandomIndices
45+ : (Float -> Float)
46+ -> List Int
47+ -> Array.Array Float
48+ -> Array.Array Float
49+updateNRandomIndices f indexList startList =
50+ List.foldr
51+ (\ i oldList -> updateN i f oldList)
52+ startList indexList
53+
43
54
44randomLookups : List Int -> Array.Array Float -> List (Maybe Float)
55randomLookups : List Int -> Array.Array Float -> List (Maybe Float)
45randomLookups indices arr =
56randomLookups indices arr =
@@ -70,4 +81,10 @@ myFoldr f init arr =
70 then init
81 then init
71 else
82 else
72 helper (f (fromJust <| Array.get i arr) init) (i-1)
83 helper (f (fromJust <| Array.get i arr) init) (i-1)
73− in helper init (len-1)
84+ in helper init (len-1)
85+
86+updateN : Int -> (a -> a) -> Array.Array a -> Array.Array a
87+updateN n f arr =
88+ case Array.get n arr of
89+ Just x -> Array.set n (f x) arr
90+ _ -> crash "Array out of bounds"
bench/src/ListBench.elm+21−1
@@ -33,13 +33,28 @@ meanAndStddev foldFn ourList =
33
33
34foldrMeanStddev = meanAndStddev List.foldr
34foldrMeanStddev = meanAndStddev List.foldr
35
35
36+
36foldlMeanStddev = meanAndStddev List.foldl
37foldlMeanStddev = meanAndStddev List.foldl
37
38
39+
38customFoldrMeanStddev = meanAndStddev myFoldr
40customFoldrMeanStddev = meanAndStddev myFoldr
39
41
42+
40customFoldlMeanStddev = meanAndStddev myFoldl
43customFoldlMeanStddev = meanAndStddev myFoldl
41
44
42
45
46+updateNRandomIndices
47+ : (Float -> Float)
48+ -> List Int
49+ -> List Float
50+ -> List Float
51+updateNRandomIndices f indexList startList =
52+ List.foldr
53+ (\ i oldList -> updateN i f oldList)
54+ startList indexList
55+
56+
57+
43randomLookups : List Int -> List Float -> List (Maybe Float)
58randomLookups : List Int -> List Float -> List (Maybe Float)
44randomLookups indices ourList =
59randomLookups indices ourList =
45 let
60 let
@@ -62,4 +77,9 @@ myFoldr : (a -> b -> b) -> b -> List a -> b
62myFoldr f init l =
77myFoldr f init l =
63 case l of
78 case l of
64 [] -> init
79 [] -> init
65− (x :: xs) -> f x (myFoldr f init xs)
80+ (x :: xs) -> f x (myFoldr f init xs)
81+
82+
83+updateN : Int -> (a -> a) -> List a -> List a
84+updateN n f list =
85+ List.indexedMap (\index value -> if index == n then f value else value) list