Created
July 22, 2018 04:06
-
-
Save manofstick/11b5ac3c3cf993ce32e69d04a6549161 to your computer and use it in GitHub Desktop.
This file contains 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
open System | |
open System.Diagnostics | |
let getNextRandom () = | |
let r = Random () | |
let rec getNext m = | |
match r.Next () with | |
| n when m |> Map.containsKey n -> getNext m | |
| n -> n | |
getNext | |
let getNextSequential () = | |
let mutable idx = 0 | |
let rec getNext _ = | |
idx <- idx + 1 | |
idx | |
getNext | |
let validate l m = | |
l |> List.iter (fun (k,v) -> | |
let check = m |> Map.find k | |
if check <> v then failwith "boom") | |
let test getNextKey iterations = | |
let r = Random () | |
let rec loop idx l m = | |
if idx = iterations then () | |
else | |
let key = getNextKey m | |
let m = m |> Map.add key idx | |
validate l m | |
loop (idx+1) ((key,idx)::l) m | |
loop 0 [] Map.empty | |
[<EntryPoint>] | |
let main argv = | |
let f = | |
match argv with | |
| [| "sequential" |] -> getNextSequential () | |
| [| "random" |] -> getNextRandom () | |
| _ -> failwith "invalid arg" | |
for i = 1 to 5 do | |
let sw = Stopwatch.StartNew () | |
test f 3000 | |
printfn "%s,%s,%d" argv.[0] (if Environment.Is64BitProcess then "64-bit" else "32-bit") sw.ElapsedMilliseconds | |
0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment