Skip to content

Instantly share code, notes, and snippets.

@AviAvni
Last active April 7, 2016 19:07
Show Gist options
  • Select an option

  • Save AviAvni/0a3576a619ff9bf4acf1958b8ca1c63b to your computer and use it in GitHub Desktop.

Select an option

Save AviAvni/0a3576a619ff9bf4acf1958b8ca1c63b to your computer and use it in GitHub Desktop.
#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