on master help sign in
Add updateN to benchmark fns
commit0d207d0b61d3717d0f113a5efeef6f68900595a7 authorjmite <jmitdase@gmail.com> dateThu 20 Aug 2015, 10:04 (11 years ago) parentb657089
3 files changed+42−3
bench/CompilerBenchmarks.elm+3−1 bench/src/ArrayBench.elm+18−1 bench/src/ListBench.elm+21−1
bench/CompilerBenchmarks.elm+3−1
@@ -24,11 +24,13 @@ mySuite =
2424 , Benchmark.bench1 "Array native foldl, 500 elems: " ArrayBench.foldlMeanStddev array500
2525 , Benchmark.bench1 "Array custom foldr, 500 elems: " ArrayBench.customFoldrMeanStddev array500
2626 , 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
2728
2829 , Benchmark.bench1 "List native foldr, 500 elems: " ListBench.foldrMeanStddev list500
2930 , Benchmark.bench1 "List native foldl, 500 elems: " ListBench.foldlMeanStddev list500
3031 , Benchmark.bench1 "List custom foldr, 500 elems: " ListBench.customFoldrMeanStddev list500
3132 , 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
3234
3335 , Benchmark.bench2 "200 lookups in array of 500 elems: " ArrayBench.randomLookups indices200 (Array.fromList [1 .. 500] )
3436 , Benchmark.bench2 "200 lookups in list of 500 elems: " ListBench.randomLookups indices200 ([1 .. 500] )
@@ -52,7 +54,7 @@ port benchResults =
5254
5355--Our main page:
5456main =
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
5658
5759
5860
bench/src/ArrayBench.elm+18−1
@@ -2,6 +2,7 @@ module ArrayBench where
22
33import Array
44import Random
5+import Debug exposing (crash)
56
67
78
@@ -40,6 +41,16 @@ customFoldrMeanStddev = meanAndStddev myFoldr
4041
4142customFoldlMeanStddev = meanAndStddev myFoldl
4243
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+
4354
4455randomLookups : List Int -> Array.Array Float -> List (Maybe Float)
4556randomLookups indices arr =
@@ -70,4 +81,10 @@ myFoldr f init arr =
7081 then init
7182 else
7283 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 =
3333
3434foldrMeanStddev = meanAndStddev List.foldr
3535
36+
3637foldlMeanStddev = meanAndStddev List.foldl
3738
39+
3840customFoldrMeanStddev = meanAndStddev myFoldr
3941
42+
4043customFoldlMeanStddev = meanAndStddev myFoldl
4144
4245
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+
4358randomLookups : List Int -> List Float -> List (Maybe Float)
4459randomLookups indices ourList =
4560 let
@@ -62,4 +77,9 @@ myFoldr : (a -> b -> b) -> b -> List a -> b
6277myFoldr f init l =
6378 case l of
6479 [] -> 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