Created
June 9, 2018 03:48
-
-
Save manofstick/847d965aff5c1de360cf63d66e8a53ed 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
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