Skip to content

Instantly share code, notes, and snippets.

@manofstick
Created July 22, 2018 04:06
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 manofstick/11b5ac3c3cf993ce32e69d04a6549161 to your computer and use it in GitHub Desktop.
Save manofstick/11b5ac3c3cf993ce32e69d04a6549161 to your computer and use it in GitHub Desktop.
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