Add the old search for kdTree + benchmark project
[master-thesis.git] / Parasitemia / Tests / ParasitemiaCore.Benchmark / Program.fs
diff --git a/Parasitemia/Tests/ParasitemiaCore.Benchmark/Program.fs b/Parasitemia/Tests/ParasitemiaCore.Benchmark/Program.fs
new file mode 100644 (file)
index 0000000..5022108
--- /dev/null
@@ -0,0 +1,70 @@
+// Learn more about F# at http://docs.microsoft.com/dotnet/fsharp
+
+open System
+open type System.Console
+
+open ParasitemiaCore.KdTree
+
+type Point (x : float32, y : float32) =
+    interface I2DCoords with
+        member this.X = x
+        member this.Y = y
+
+    override this.ToString () =
+        sprintf "(%.1f, %.1f)" x y
+
+let kdTree () =
+    let min = -1_000.
+    let max = +1_000.
+    let windowSize = 10.
+    let nbPoints = 1_000_000
+    let n = 1_000_000
+
+    let rng = Random 42
+    let nextNumber (min : float) (max : float) (rng : Random) =
+        (rng.NextDouble () * (max + abs min)) + min |> float32
+
+    let points =
+        [
+            for i = 1 to nbPoints do
+                let x = nextNumber min max rng
+                let y = nextNumber min max rng
+                Point (x, y)
+        ]
+
+    let sw = System.Diagnostics.Stopwatch ()
+    sw.Start ()
+
+    let tree = Tree.BuildTree points
+
+    sw.Stop ()
+    WriteLine (sprintf "Time to build = %A ms" sw.ElapsedMilliseconds)
+
+    let rng = Random 42
+    sw.Restart ()
+
+    let mutable nbFound = 0
+    for i = 1 to n do
+        let minX = nextNumber min (max - windowSize) rng
+        let minY = nextNumber min (max - windowSize) rng
+        nbFound <- nbFound + (tree.SearchOld { minX = minX; maxX = minX + float32 windowSize; minY = minY; maxY = minY + float32 windowSize } |> List.length)
+
+    sw.Stop ()
+    WriteLine (sprintf "New: nb found: %i. Time to search = %A ms" nbFound sw.ElapsedMilliseconds)
+
+    let rng = Random 42
+    sw.Restart ()
+
+    let mutable nbFound = 0
+    for i = 1 to n do
+        let minX = nextNumber min (max - windowSize) rng
+        let minY = nextNumber min (max - windowSize) rng
+        nbFound <- nbFound + (tree.Search { minX = minX; maxX = minX + float32 windowSize; minY = minY; maxY = minY + float32 windowSize }).Count
+
+    sw.Stop ()
+    WriteLine (sprintf "New: nb found: %i. Time to search = %A ms" nbFound sw.ElapsedMilliseconds)
+
+[<EntryPoint>]
+let main argv =
+    kdTree ()
+    0
\ No newline at end of file