Last active
April 7, 2016 19:07
-
-
Save AviAvni/0a3576a619ff9bf4acf1958b8ca1c63b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #time | |
| let inline sum list = | |
| match list with | |
| | [] -> LanguagePrimitives.GenericZero< 'T > | |
| | t -> | |
| let mutable acc = LanguagePrimitives.GenericZero< 'T > | |
| for x in t do | |
| acc <- Checked.(+) acc x | |
| acc | |
| let inline sumBy f list = | |
| match list with | |
| | [] -> LanguagePrimitives.GenericZero< 'U > | |
| | t -> | |
| let mutable acc = LanguagePrimitives.GenericZero< 'U > | |
| for x in t do | |
| acc <- Checked.(+) acc (f x) | |
| acc | |
| let inline max list = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable acc = h | |
| for x in t do | |
| if x > acc then | |
| acc <- x | |
| acc | |
| let inline maxBy (f: 'T -> 'U) (list:list<'T>) = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable acc = h | |
| let mutable accv = f h | |
| for x in t do | |
| let currv = f x | |
| if currv > accv then | |
| acc <- x | |
| accv <- currv | |
| acc | |
| let inline min list = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable acc = h | |
| for x in t do | |
| if x < acc then | |
| acc <- x | |
| acc | |
| let inline minBy (f: 'T -> 'U) (list:list<'T>) = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable acc = h | |
| let mutable accv = f h | |
| for x in t do | |
| let currv = f x | |
| if currv < accv then | |
| acc <- x | |
| accv <- currv | |
| acc | |
| let inline average (list:list<'T>) = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable sum = h | |
| let mutable count = 0 | |
| for x in t do | |
| sum <- Checked.(+) sum x | |
| count <- count + 1 | |
| LanguagePrimitives.DivideByInt sum count | |
| let inline averageBy (f : 'T -> 'U) (list:list<'T>) = | |
| match list with | |
| | [] -> invalidArg "list" "ERROR" | |
| | h::t -> | |
| let mutable sum = f h | |
| let mutable count = 0 | |
| for x in t do | |
| sum <- Checked.(+) sum (f x) | |
| count <- count + 1 | |
| LanguagePrimitives.DivideByInt sum count | |
| let count = 5000000 | |
| let listOfInts = List.replicate count 1 | |
| let listOfLongs = List.replicate count 1L | |
| let listOfFloat32s = List.replicate count 1.0f | |
| let listOfDoubles = List.replicate count 1.0 | |
| let listOfDecimals = List.replicate count 1.0M | |
| let listOfInts1 = [1..count] | |
| let listOfLongs1 = [1L..int64 count] | |
| let listOfFloat32s1 = [1.0f..float32 count] | |
| let listOfDoubles1 = [1.0..float count] | |
| let listOfDecimals1 = [1.0M..decimal count] | |
| let run (f : 'a -> 'b) l = | |
| let res = f l | |
| for i in 2..100 do | |
| f l |> ignore | |
| res | |
| run List.sum listOfInts // Real: 00:00:05.138, CPU: 00:00:04.656, GC gen0: 0, gen1: 0, gen2: 0 | |
| run sum listOfInts // Real: 00:00:00.936, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.sum listOfLongs // Real: 00:00:05.398, CPU: 00:00:05.125, GC gen0: 0, gen1: 0, gen2: 0 | |
| run sum listOfLongs // Real: 00:00:01.092, CPU: 00:00:01.078, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.sum listOfFloat32s // Real: 00:00:05.297, CPU: 00:00:04.781, GC gen0: 0, gen1: 0, gen2: 0 | |
| run sum listOfFloat32s // Real: 00:00:00.944, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.sum listOfDoubles // Real: 00:00:06.103, CPU: 00:00:05.125, GC gen0: 0, gen1: 0, gen2: 0 | |
| run sum listOfDoubles // Real: 00:00:01.099, CPU: 00:00:01.109, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.sumBy float) listOfInts // Real: 00:00:04.872, CPU: 00:00:04.859, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (sumBy float) listOfInts // Real: 00:00:00.932, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.sumBy float) listOfLongs // Real: 00:00:09.925, CPU: 00:00:09.921, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (sumBy float) listOfLongs // Real: 00:00:04.847, CPU: 00:00:04.843, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.sumBy float) listOfFloat32s // Real: 00:00:05.103, CPU: 00:00:05.109, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (sumBy float) listOfFloat32s // Real: 00:00:00.952, CPU: 00:00:00.953, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.sumBy float) listOfDoubles // Real: 00:00:05.083, CPU: 00:00:05.078, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (sumBy float) listOfDoubles // Real: 00:00:01.089, CPU: 00:00:01.078, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.sumBy float) listOfDecimals // Real: 00:00:21.799, CPU: 00:00:21.781, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (sumBy float) listOfDecimals // Real: 00:00:13.646, CPU: 00:00:13.640, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.max listOfInts // Real: 00:00:04.283, CPU: 00:00:04.281, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfInts // Real: 00:00:00.932, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfInts1 // Real: 00:00:00.893, CPU: 00:00:00.890, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.max listOfLongs // Real: 00:00:04.592, CPU: 00:00:04.593, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfLongs // Real: 00:00:01.094, CPU: 00:00:01.109, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfLongs1 // Real: 00:00:01.073, CPU: 00:00:01.078, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.max listOfFloat32s // Real: 00:00:05.688, CPU: 00:00:05.687, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfFloat32s // Real: 00:00:00.929, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfFloat32s1 // Real: 00:00:00.892, CPU: 00:00:00.890, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.max listOfDoubles // Real: 00:00:06.118, CPU: 00:00:06.125, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfDoubles // Real: 00:00:01.103, CPU: 00:00:01.078, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfDoubles1 // Real: 00:00:01.065, CPU: 00:00:01.062, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.max listOfDecimals // Real: 00:00:13.583, CPU: 00:00:13.578, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfDecimals // Real: 00:00:08.320, CPU: 00:00:08.296, GC gen0: 0, gen1: 0, gen2: 0 | |
| run max listOfDecimals1 // Real: 00:00:08.949, CPU: 00:00:08.953, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.maxBy float) listOfInts // Real: 00:00:04.945, CPU: 00:00:04.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfInts // Real: 00:00:00.940, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfInts1 // Real: 00:00:01.040, CPU: 00:00:01.031, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.maxBy float) listOfLongs // Real: 00:00:10.190, CPU: 00:00:10.171, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfLongs // Real: 00:00:05.481, CPU: 00:00:05.484, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfLongs1 // Real: 00:00:05.361, CPU: 00:00:05.359, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.maxBy float) listOfFloat32s // Real: 00:00:04.830, CPU: 00:00:04.812, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfFloat32s // Real: 00:00:01.052, CPU: 00:00:01.046, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfFloat32s1 // Real: 00:00:01.389, CPU: 00:00:01.390, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.maxBy float) listOfDoubles // Real: 00:00:04.591, CPU: 00:00:04.593, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfDoubles // Real: 00:00:01.095, CPU: 00:00:01.093, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfDoubles1 // Real: 00:00:01.041, CPU: 00:00:01.046, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.maxBy float) listOfDecimals // Real: 00:00:19.632, CPU: 00:00:19.625, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfDecimals // Real: 00:00:14.777, CPU: 00:00:14.765, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (maxBy float) listOfDecimals1 // Real: 00:00:15.189, CPU: 00:00:15.187, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfInts // Real: 00:00:03.671, CPU: 00:00:03.671, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfInts // Real: 00:00:00.923, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfInts // Real: 00:00:03.678, CPU: 00:00:03.656, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfInts // Real: 00:00:00.931, CPU: 00:00:00.906, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfLongs // Real: 00:00:03.925, CPU: 00:00:03.890, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfLongs // Real: 00:00:01.090, CPU: 00:00:01.046, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfFloat32s // Real: 00:00:04.058, CPU: 00:00:04.046, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfFloat32s // Real: 00:00:00.939, CPU: 00:00:00.921, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfDoubles // Real: 00:00:04.066, CPU: 00:00:04.062, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfDoubles // Real: 00:00:01.096, CPU: 00:00:01.109, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.min listOfDecimals // Real: 00:00:09.768, CPU: 00:00:09.750, GC gen0: 0, gen1: 0, gen2: 0 | |
| run min listOfDecimals // Real: 00:00:08.275, CPU: 00:00:08.281, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.average listOfFloat32s // Real: 00:00:03.780, CPU: 00:00:03.750, GC gen0: 0, gen1: 0, gen2: 0 | |
| run average listOfFloat32s // Real: 00:00:00.941, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.average listOfDoubles // Real: 00:00:03.807, CPU: 00:00:03.765, GC gen0: 0, gen1: 0, gen2: 0 | |
| run average listOfDoubles // Real: 00:00:01.090, CPU: 00:00:01.093, GC gen0: 0, gen1: 0, gen2: 0 | |
| run List.average listOfDecimals // Real: 00:00:09.878, CPU: 00:00:09.890, GC gen0: 0, gen1: 0, gen2: 0 | |
| run average listOfDecimals // Real: 00:00:08.418, CPU: 00:00:08.406, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.averageBy float) listOfFloat32s // Real: 00:00:04.011, CPU: 00:00:04.000, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (averageBy float) listOfFloat32s // Real: 00:00:00.943, CPU: 00:00:00.937, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.averageBy float) listOfDoubles // Real: 00:00:03.876, CPU: 00:00:03.843, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (averageBy float) listOfDoubles // Real: 00:00:01.103, CPU: 00:00:01.109, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (List.averageBy float) listOfDecimals // Real: 00:00:16.809, CPU: 00:00:16.796, GC gen0: 0, gen1: 0, gen2: 0 | |
| run (averageBy float) listOfDecimals // Real: 00:00:14.021, CPU: 00:00:14.000, GC gen0: 0, gen1: 0, gen2: 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment