Skip to content

Instantly share code, notes, and snippets.

@ChadSki
Created July 6, 2019 00:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ChadSki/3a05de70cbcfe5df8d8247fe19af880f to your computer and use it in GitHub Desktop.
Save ChadSki/3a05de70cbcfe5df8d8247fe19af880f to your computer and use it in GitHub Desktop.
allocation test
open System
// returns: median value of a list
let inline median input =
let sorted = input |> Seq.toArray |> Array.sort
let m1,m2 =
let len = sorted.Length-1 |> float
len/2. |> floor |> int, len/2. |> ceil |> int
(sorted.[m1] + sorted.[m2] |> float)/2.
// n: allocate a (n * n) array at once
// x: fill the array with this
// returns: milliseconds to do all allocations
let medianAllocateTime numTrials numTimes n x =
let mutable results = []
for attempt in 1 .. numTrials do
printf "."
let stopWatch = System.Diagnostics.Stopwatch.StartNew()
for i in 1 .. numTimes do
Array2D.init n n (fun x y -> x) |> ignore
stopWatch.Stop()
results <- stopWatch.Elapsed.TotalMilliseconds::results
median results
[<EntryPoint>]
let main argv =
let numTrials = 100
let numTimes = 1000
let blank = String.replicate (numTrials - 20) " "
let banner = String.replicate numTrials "="
printfn "Testing with %d allocations..." numTimes
printfn "%s" banner
printfn "\r 1KiB (16*16 * 4) = %.2fms%s" (medianAllocateTime numTrials numTimes 16 0s) blank
printfn "\r 2KiB (16*16 * 8) = %.2fms%s" (medianAllocateTime numTrials numTimes 16 0) blank
printfn "\r 4KiB (16*16 * 16) = %.2fms%s" (medianAllocateTime numTrials numTimes 16 0L) blank
printfn "%s" banner
printfn "\r 4KiB (32*32 * 4) = %.2fms%s" (medianAllocateTime numTrials numTimes 32 0s) blank
printfn "\r 8KiB (32*32 * 8) = %.2fms%s" (medianAllocateTime numTrials numTimes 32 0) blank
printfn "\r 16KiB (32*32 * 16) = %.2fms%s" (medianAllocateTime numTrials numTimes 32 0L) blank
printfn "%s" banner
printfn "\r 16KiB (64*64 * 4) = %.2fms%s" (medianAllocateTime numTrials numTimes 64 0s) blank
printfn "\r 32KiB (64*64 * 8) = %.2fms%s" (medianAllocateTime numTrials numTimes 64 0) blank
printfn "\r 64KiB (64*64 * 16) = %.2fms%s" (medianAllocateTime numTrials numTimes 64 0L) blank
printfn "%s" banner
printfn "\r 64KiB (128*128 * 4) = %.2fms%s" (medianAllocateTime numTrials numTimes 128 0s) blank
printfn "\r 128KiB (128*128 * 8) = %.2fms%s" (medianAllocateTime numTrials numTimes 128 0) blank
printfn "\r 256KiB (128*128 * 16) = %.2fms%s" (medianAllocateTime numTrials numTimes 128 0L) blank
printfn "%s" banner
printfn "\r 256KiB (128*128 * 4) = %.2fms%s" (medianAllocateTime numTrials numTimes 256 0s) blank
printfn "\r 512KiB (128*128 * 8) = %.2fms%s" (medianAllocateTime numTrials numTimes 256 0) blank
printfn "\r 1MiB (128*128 * 16) = %.2fms%s" (medianAllocateTime numTrials numTimes 256 0L) blank
printfn "Done."
Console.ReadKey() |> ignore
0
Testing with 1000 allocations...
====================================================================================================
1KiB (16*16 * 4) = 4.42ms
2KiB (16*16 * 8) = 4.10ms
4KiB (16*16 * 16) = 3.65ms
====================================================================================================
4KiB (32*32 * 4) = 9.29ms
8KiB (32*32 * 8) = 9.98ms
16KiB (32*32 * 16) = 10.39ms
====================================================================================================
16KiB (64*64 * 4) = 33.32ms
32KiB (64*64 * 8) = 33.28ms
64KiB (64*64 * 16) = 33.20ms
====================================================================================================
64KiB (128*128 * 4) = 130.49ms
128KiB (128*128 * 8) = 131.86ms
256KiB (128*128 * 16) = 130.49ms
====================================================================================================
256KiB (128*128 * 4) = 523.45ms
512KiB (128*128 * 8) = 517.18ms
1MiB (128*128 * 16) = 517.35ms
Done.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment