Skip to content

Instantly share code, notes, and snippets.

@manofstick
Created June 9, 2018 03:48
Show Gist options
  • Save manofstick/847d965aff5c1de360cf63d66e8a53ed to your computer and use it in GitHub Desktop.
Save manofstick/847d965aff5c1de360cf63d66e8a53ed to your computer and use it in GitHub Desktop.
module Program
open System.Diagnostics
type Key1 =
struct
val A : int
new (a)= { A = a }
end
type Key2 =
struct
val A : int
val B : int
new (a,b)= { A=a;B=b }
end
type Key3 =
struct
val A : int
val B : int
val C : int
new (a,b,c)= { A=a;B=b;C=c }
end
type Key4 =
struct
val A : int
val B : int
val C : int
val D : int
new (a,b,c,d)= { A=a;B=b;C=c;D=d }
end
type Key5 =
struct
val A : int
val B : int
val C : int
val D : int
val E : int
new (a,b,c,d,e)= { A=a;B=b;C=c;D=d;E=e }
end
let seqTest f n createKey =
let sw = Stopwatch.StartNew ()
let count =
Seq.init n id
|> f createKey
|> Seq.length
count, sw.ElapsedMilliseconds
let listTest f n createKey =
let sw = Stopwatch.StartNew ()
let count =
List.init n id
|> f createKey
|> List.length
count, sw.ElapsedMilliseconds
let arrayTest f n createKey =
let sw = Stopwatch.StartNew ()
let count =
Array.init n id
|> f createKey
|> Array.length
count, sw.ElapsedMilliseconds
let dictTest n createKey =
let sw = Stopwatch.StartNew ()
let count =
Array.init n (fun n -> createKey n, n)
|> dict
|> fun d -> d.Count
count, sw.ElapsedMilliseconds
let createKey2 n = Key2(n%11,n%7)
let createKey3 n = Key3(n%11,n%7,n%5)
let createKey4 n = Key4(n%11,n%7,n%5,n%3)
let createKey5 n = Key5(n%11,n%7,n%5,n%3,n%2)
let createDictKey2 n = Key2(n,n)
let createDictKey3 n = Key3(n,n,n)
let createDictKey4 n = Key4(n,n,n,n)
let createDictKey5 n = Key5(n,n,n,n,n)
let runSeqGroupByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = seqTest Seq.groupBy size createKey2
let c3, t3 = seqTest Seq.groupBy size createKey3
let c4, t4 = seqTest Seq.groupBy size createKey4
let c5, t5 = seqTest Seq.groupBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "seqGroupBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "seqGroupBy totalTime=%d" totalTime
let runSeqCountByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = seqTest Seq.countBy size createKey2
let c3, t3 = seqTest Seq.countBy size createKey3
let c4, t4 = seqTest Seq.countBy size createKey4
let c5, t5 = seqTest Seq.countBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "seqCountBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "seqCountBy totalTime=%d" totalTime
let runListGroupByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = listTest List.groupBy size createKey2
let c3, t3 = listTest List.groupBy size createKey3
let c4, t4 = listTest List.groupBy size createKey4
let c5, t5 = listTest List.groupBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "listGroupBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "listGroupBy totalTime=%d" totalTime
let runListCountByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = listTest List.countBy size createKey2
let c3, t3 = listTest List.countBy size createKey3
let c4, t4 = listTest List.countBy size createKey4
let c5, t5 = listTest List.countBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "listCountBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "listCountBy totalTime=%d" totalTime
let runArrayGroupByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = arrayTest Array.groupBy size createKey2
let c3, t3 = arrayTest Array.groupBy size createKey3
let c4, t4 = arrayTest Array.groupBy size createKey4
let c5, t5 = arrayTest Array.groupBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "arrayGroupBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "arrayGroupBy totalTime=%d" totalTime
let runArrayCountByTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = arrayTest Array.countBy size createKey2
let c3, t3 = arrayTest Array.countBy size createKey3
let c4, t4 = arrayTest Array.countBy size createKey4
let c5, t5 = arrayTest Array.countBy size createKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "arrayCountBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "arrayCountBy totalTime=%d" totalTime
let runDictTest () =
let size = 100000
let mutable totalTime = 0L
for i = 1 to 5 do
let c2, t2 = dictTest size createDictKey2
let c3, t3 = dictTest size createDictKey3
let c4, t4 = dictTest size createDictKey4
let c5, t5 = dictTest size createDictKey5
totalTime <- totalTime + t2 + t3 + t4 + t5
printfn "arrayCountBy %d,%d,%d,%d (%d,%d,%d,%d)" t2 t3 t4 t5 c2 c3 c4 c5
printfn "arrayCountBy totalTime=%d" totalTime
[<EntryPoint>]
let main _ =
//printfn "%s" Id.Name
runSeqGroupByTest()
runSeqCountByTest()
runListGroupByTest()
runListCountByTest()
runArrayCountByTest()
runArrayGroupByTest()
runDictTest ()
0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment