Add an ellipse benchmark + unit test (WIP)
[master-thesis.git] / Parasitemia / Tests / ParasitemiaCore.Benchmark / KdTreeBench.fs
diff --git a/Parasitemia/Tests/ParasitemiaCore.Benchmark/KdTreeBench.fs b/Parasitemia/Tests/ParasitemiaCore.Benchmark/KdTreeBench.fs
new file mode 100644 (file)
index 0000000..028939b
--- /dev/null
@@ -0,0 +1,65 @@
+module ParasitemiaCore.KdTreeBench
+
+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 bench1 () =
+    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)
\ No newline at end of file