Repository: milesgranger/gilknocker (language: python)

Issue:
Add sampling interval
I was thinking about this implementation.
As we have it now, it needs to continuously poll at a fairly high rate (1ms) to get a reliable feel for how busy the GIL is when compared with `py-spy`.

Now I think if we have two intervals, a `sampling interval` and a `polling interval`. It won't need to poll continuously for the life of the monitoring but rather poll at the (potentially) high interval only for `sampling interval` example: it polls at 1ms intervals for 10ms sampling intervals.

I'd assume the same numerator used (time taken to get the GIL after requested) over instead of global time, but sum of polling intervals ought to give a pretty similar result but shouldn't be as taxing on programs. 

cc @fjetter
Incorrect (possibly old?) links on PyPI
I noticed a couple of links on PyPI were giving 404s because they're pointing to `gil-knocker` instead of `gilknocker`

https://github.com/milesgranger/gilknocker/blob/25a9104e1fcd7a0ced15d248b225f352730b1677/pyproject.toml#L6-L8

I've not grepped through the codebase to see if there are other `gil-knocker` references or not 


Discussion / hints:
So, just to wrap my head around this. we'd have a "Probe" running every `sampling interval` and this probe is running for `?` time every `polling interval` seconds trying to acquire the GIL? Something like


| --- Nothing for `sampling` ms --- | -<>-<>-poll every `polling`ms <>-<> -| -----Nothing -----|
That's exactly right.
from a concept POV I think this is fine. It sounds easy enough to implement and I'd be curious to see if we can produce reasonably similar results.
The concern I have is that the benchmarks you are using are rather uniform in the way they are stressing a thread (specifically the `a_lotta_gil` function is very uniform. we may want to use something else for this. For example

```python
import random

def some_gil():    
    for i in range(10000):
        # On my machine the allocation of that KiB takes about 10-20us so
        # this sleep is about the same order of magnitude
        # Sleeping a bit more or allocating a bit more data will shift the GIL-measure in either
        # direction but the random sleep will make the measurement a bit harder
        time.sleep(random.random() / 100_000)
        b"1" * 1024**2
```


Fix patch:
diff --git a/Cargo.lock b/Cargo.lock
index 82d0579..cc4f816 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -22,7 +22,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
 
 [[package]]
 name = "gil-knocker"
-version = "0.2.2"
+version = "0.3.0"
 dependencies = [
  "parking_lot",
  "pyo3",
diff --git a/Cargo.toml b/Cargo.toml
index 50fa59e..1a43ade 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "gil-knocker"
-version = "0.2.2"
+version = "0.3.0"
 edition = "2021"
 authors = ["Miles Granger <miles59923@gmail.com>"]
 license = "MIT"
diff --git a/README.md b/README.md
index 5c9acd1..1b0a61c 100644
--- a/README.md
+++ b/README.md
@@ -32,7 +32,7 @@ to align with what is reported by `py-spy` when running the same [test case](./t
 This works by spawning a thread which, at regular intervals, re-acquires the GIL and checks 
 how long it took for the GIL to answer.
 
-Note, the interval (`interval_micros`) is configurable. The lower the value, the 
+Note, the `polling_interval_micros` and `sampling_interval_micros` are configurable. The lower the value, the 
 more accurate the metric, but will be more likely to slow your
 program down.. because it will play a larger role in competing for the GIL's attention.
 
@@ -44,7 +44,7 @@ Look at the [tests](./tests)
 
 from gilknocker import KnockKnock
 
-knocker = KnockKnock(interval_micros=1000, timeout_secs=1)
+knocker = KnockKnock(polling_interval_micros=1_000, sampling_interval_micros=10_000, timeout_secs=1)
 knocker.start()
 
 ... smart code here ...
@@ -55,42 +55,55 @@ knocker.reset_contention_metric()  # reset timers and meteric calculation
 ... some more smart code ...
 
 knocker.stop()
+knocker.stop()  # Idempodent stopping behavior
 
 knocker.contention_metric  # will stay the same after `stop()` is called.
 
+knocker.is_running  # If you're ever in doubt
+
 ```
 
 ### How will this impact my program?
 
 Short answer, it depends, but probably not much. As stated above, the more frequent the 
-monitoring interval, the more likely non-GIL bound programs will be affected, since there is 
+polling and sampling interval, the more likely non-GIL bound programs will be affected, since there is 
 more room for contention. In GIL heavy programs, the monitoring thread will spend most of its 
 time simply waiting for a lock. This is demonstrated in the [benchmarks](./benchmarks) testing.
 
+In general, it appears that `polling_interval_micros=1_000` is a good tradeoff in terms of accurate
+GIL contention metric and the resulting `sampling_interval_micros=10_000` (defaults to 10x polling interval)
+is high enough to relax performance impact a bit.
+
 Below is a summary of benchmarking two different 
 functions, one which uses the GIL, and one which releases it. For `interval=None` this means 
 no polling was used, effectively just running the function without `gilknocker`. Otherwise, 
-the interval represents the value passed to `KnockKnock(interval_micros=interval)`
+the interval represents the value passed to `KnockKnock(polling_interval_micros=interval)`
 
 `python -m pytest -v --benchmark-only benchmarks/ --benchmark-histogram`
 
 ```
----------------------------------------------------------------------------------------------- benchmark: 12 tests ----------------------------------------------------------------------------------------------
-Name (time in ms)                          Min                   Max                  Mean             StdDev                Median                 IQR            Outliers     OPS            Rounds  Iterations
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-test_bench[a_lotta_gil-None]          697.6828 (1.0)        804.5402 (1.11)       755.6981 (1.06)     53.0970 (61.53)      777.1266 (1.09)     101.6509 (83.91)         2;0  1.3233 (0.95)          5           1
-test_bench[a_lotta_gil-10]            707.0513 (1.01)       724.3552 (1.0)        714.4783 (1.0)       6.8460 (7.93)       715.2083 (1.0)       10.0545 (8.30)          2;0  1.3996 (1.0)           5           1
-test_bench[a_lotta_gil-1000]          708.0325 (1.01)       742.4564 (1.02)       722.2247 (1.01)     12.6517 (14.66)      721.7707 (1.01)      12.5343 (10.35)         2;0  1.3846 (0.99)          5           1
-test_bench[a_lotta_gil-10000]         716.1168 (1.03)       791.8905 (1.09)       733.0825 (1.03)     32.9744 (38.21)      717.7345 (1.00)      23.2516 (19.19)         1;1  1.3641 (0.97)          5           1
-test_bench[a_lotta_gil-100000]        758.2248 (1.09)       760.4424 (1.05)       759.2441 (1.06)      0.8629 (1.0)        758.9144 (1.06)       1.2114 (1.0)           2;0  1.3171 (0.94)          5           1
-test_bench[a_lotta_gil-100]           760.8787 (1.09)       839.1526 (1.16)       777.9811 (1.09)     34.2144 (39.65)      763.4823 (1.07)      20.4199 (16.86)         1;1  1.2854 (0.92)          5           1
-test_bench[a_little_gil-None]       1,505.1989 (2.16)     1,510.2234 (2.08)     1,508.0564 (2.11)      1.8985 (2.20)     1,508.2229 (2.11)       2.5074 (2.07)          2;0  0.6631 (0.47)          5           1
-test_bench[a_little_gil-100000]     1,506.0053 (2.16)     1,559.4051 (2.15)     1,531.3341 (2.14)     22.6875 (26.29)    1,524.5321 (2.13)      38.7802 (32.01)         2;0  0.6530 (0.47)          5           1
-test_bench[a_little_gil-10000]      1,508.9686 (2.16)     1,521.0912 (2.10)     1,515.0701 (2.12)      5.5128 (6.39)     1,514.7033 (2.12)      10.3673 (8.56)          2;0  0.6600 (0.47)          5           1
-test_bench[a_little_gil-1000]       1,534.0449 (2.20)     1,540.6296 (2.13)     1,537.8621 (2.15)      2.5307 (2.93)     1,538.5808 (2.15)       3.4261 (2.83)          2;0  0.6503 (0.46)          5           1
-test_bench[a_little_gil-100]        1,566.4128 (2.25)     1,576.2634 (2.18)     1,569.6245 (2.20)      4.0978 (4.75)     1,567.4297 (2.19)       5.3087 (4.38)          1;0  0.6371 (0.46)          5           1
-test_bench[a_little_gil-10]         1,587.1471 (2.27)     1,597.2920 (2.21)     1,592.0651 (2.23)      3.7001 (4.29)     1,591.2409 (2.22)       4.1942 (3.46)          2;0  0.6281 (0.45)          5           1
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------ benchmark: 18 tests -------------------------------------------------------------------------------------
+Name (time in s)                       Min               Max              Mean            StdDev            Median               IQR            Outliers     OPS            Rounds  Iterations
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+test_bench[a_little_gil-100000]     1.5368 (2.07)     1.6596 (2.23)     1.5968 (2.14)     0.0476 (130.12)   1.5943 (2.14)     0.0719 (140.14)        2;0  0.6262 (0.47)          5           1
+test_bench[a_little_gil-10000]      1.5321 (2.06)     1.5989 (2.14)     1.5618 (2.09)     0.0289 (78.95)    1.5610 (2.09)     0.0510 (99.52)         2;0  0.6403 (0.48)          5           1
+test_bench[a_little_gil-1000]       1.5246 (2.05)     1.5298 (2.05)     1.5271 (2.05)     0.0019 (5.12)     1.5269 (2.05)     0.0021 (4.00)          2;0  0.6549 (0.49)          5           1
+test_bench[a_little_gil-100]        1.5505 (2.09)     1.5543 (2.08)     1.5528 (2.08)     0.0014 (3.96)     1.5533 (2.08)     0.0018 (3.60)          2;0  0.6440 (0.48)          5           1
+test_bench[a_little_gil-10]         1.5863 (2.13)     1.6074 (2.16)     1.5928 (2.14)     0.0088 (23.94)    1.5896 (2.13)     0.0111 (21.60)         1;0  0.6278 (0.47)          5           1
+test_bench[a_little_gil-None]       1.5043 (2.02)     1.5067 (2.02)     1.5051 (2.02)     0.0011 (2.95)     1.5044 (2.02)     0.0016 (3.17)          1;0  0.6644 (0.50)          5           1
+test_bench[a_lotta_gil-100000]      0.7450 (1.00)     0.7458 (1.0)      0.7455 (1.0)      0.0004 (1.0)      0.7457 (1.0)      0.0005 (1.0)           1;0  1.3413 (1.0)           5           1
+test_bench[a_lotta_gil-10000]       0.7471 (1.00)     0.8104 (1.09)     0.7601 (1.02)     0.0281 (76.94)    0.7472 (1.00)     0.0168 (32.82)         1;1  1.3156 (0.98)          5           1
+test_bench[a_lotta_gil-1000]        0.7436 (1.0)      0.7472 (1.00)     0.7463 (1.00)     0.0015 (4.11)     0.7470 (1.00)     0.0013 (2.54)          1;1  1.3400 (1.00)          5           1
+test_bench[a_lotta_gil-100]         0.7558 (1.02)     0.7680 (1.03)     0.7640 (1.02)     0.0050 (13.56)    0.7644 (1.03)     0.0061 (11.97)         1;0  1.3089 (0.98)          5           1
+test_bench[a_lotta_gil-10]          0.7542 (1.01)     0.7734 (1.04)     0.7649 (1.03)     0.0084 (23.05)    0.7669 (1.03)     0.0151 (29.45)         2;0  1.3074 (0.97)          5           1
+test_bench[a_lotta_gil-None]        0.7437 (1.00)     0.8490 (1.14)     0.8006 (1.07)     0.0501 (137.15)   0.8074 (1.08)     0.0969 (189.03)        1;0  1.2490 (0.93)          5           1
+test_bench[some_gil-100000]         1.4114 (1.90)     1.4131 (1.89)     1.4122 (1.89)     0.0007 (1.81)     1.4121 (1.89)     0.0010 (2.00)          2;0  0.7081 (0.53)          5           1
+test_bench[some_gil-10000]          1.4115 (1.90)     1.4258 (1.91)     1.4167 (1.90)     0.0059 (16.03)    1.4141 (1.90)     0.0083 (16.19)         1;0  0.7058 (0.53)          5           1
+test_bench[some_gil-1000]           1.4169 (1.91)     1.5793 (2.12)     1.4618 (1.96)     0.0690 (188.82)   1.4232 (1.91)     0.0769 (150.04)        1;0  0.6841 (0.51)          5           1
+test_bench[some_gil-100]            1.4468 (1.95)     1.6261 (2.18)     1.5701 (2.11)     0.0752 (205.83)   1.5998 (2.15)     0.1004 (195.70)        1;0  0.6369 (0.47)          5           1
+test_bench[some_gil-10]             1.5269 (2.05)     1.9894 (2.67)     1.7037 (2.29)     0.1895 (518.49)   1.7301 (2.32)     0.2692 (524.96)        1;0  0.5870 (0.44)          5           1
+test_bench[some_gil-None]           1.4115 (1.90)     1.4267 (1.91)     1.4155 (1.90)     0.0063 (17.33)    1.4136 (1.90)     0.0053 (10.24)         1;1  0.7065 (0.53)          5           1
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 ```
 
 ![](./benchmarks/histogram.svg)
diff --git a/benchmarks/histogram.svg b/benchmarks/histogram.svg
index 6a5c167..28f1ecb 100644
--- a/benchmarks/histogram.svg
+++ b/benchmarks/histogram.svg
@@ -1,8 +1,8 @@
 <?xml version='1.0' encoding='utf-8'?>
-<svg xmlns="http://www.w3.org/2000/svg" id="chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937" class="pygal-chart" viewBox="0 0 800 600"><!--Generated with pygal 3.0.0 (etree) ©Kozea 2012-2016 on 2023-01-19--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .title{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:16px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .legends .legend text{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:14px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis text{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis text.major{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay text.value{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:16px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay text.label{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:14px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 text.no_data{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:64px}
-#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937{background-color:rgba(249,249,249,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 path,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 rect,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 circle{-webkit-transition:150ms;-moz-transition:150ms;transition:150ms}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .graph &gt; .background{fill:rgba(249,249,249,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .plot &gt; .background{fill:rgba(255,255,255,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .graph{fill:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 text.no_data{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .title{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .legends .legend text{fill:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .legends .legend:hover text{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .line{stroke:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .guide.line{stroke:rgba(0,0,0,.54)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .major.line{stroke:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis text.major{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y .guides:hover .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .line-graph .axis.x .guides:hover .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .stackedline-graph .axis.x .guides:hover .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .guides:hover text{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .reactive{fill-opacity:.7;stroke-opacity:.8;stroke-width:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .ci{stroke:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .reactive.active,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .active .reactive{fill-opacity:.8;stroke-opacity:.9;stroke-width:4}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .ci .reactive.active{stroke-width:1.5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .series text{fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip rect{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,1);-webkit-transition:opacity 150ms;-moz-transition:opacity 150ms;transition:opacity 150ms}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .label{fill:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .label{fill:rgba(0,0,0,.87)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,.54)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,1)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip .value{font-size:1.5em}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .bound{font-size:.5em}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .max-value{font-size:.75em;fill:rgba(0,0,0,.54)}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .map-element{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,.54) !important}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-0,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-0 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-1,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-1 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-2,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-2 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-3,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-3 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-4,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-4 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-5,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-5 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-6,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-6 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-7,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-7 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-8,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-8 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-9,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-9 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-10,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-10 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-11,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .color-11 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-0 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-1 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-2 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-3 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-4 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-5 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-6 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-7 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-8 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-9 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-10 text{fill:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .text-overlay .color-11 text{fill:black}
-#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 text.no_data{text-anchor:middle}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .guide.line{fill:none}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .centered{text-anchor:middle}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .title{text-anchor:middle}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .legends .legend text{fill-opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.x text{text-anchor:middle}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.x:not(.web) text[transform]{text-anchor:start}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y text{text-anchor:end}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y text[transform].backwards{text-anchor:start}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y2 text{text-anchor:start}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y2 text[transform].backwards{text-anchor:end}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .guide.line{stroke-dasharray:4,4;stroke:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .major.guide.line{stroke-dasharray:6,6;stroke:black}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .horizontal .axis.y .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .horizontal .axis.y2 .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .vertical .axis.x .guide.line{opacity:0}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .horizontal .axis.always_show .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y .guides:hover .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.y2 .guides:hover .guide.line,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis.x .guides:hover .guide.line{opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .axis .guides:hover text{opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .nofill{fill:none}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .subtle-fill{fill-opacity:.2}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .dot{stroke-width:1px;fill-opacity:1;stroke-opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .dot.active{stroke-width:5px}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .dot.negative{fill:transparent}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 text,#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 tspan{stroke:none !important}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .series text.active{opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .tooltip text{fill-opacity:1}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .showable{visibility:hidden}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .showable.shown{visibility:visible}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-a2a72fb4-252a-4a2b-9b12-3919b2ea2937 .bg-lines{stroke:rgba(249,249,249,1);stroke-width:2px}
-.tooltip .value{font-size:1em !important}.axis text{font-size:9px !important}</style><script type="text/javascript">window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['a2a72fb4-252a-4a2b-9b12-3919b2ea2937'] = {"allow_interruptions": false, "box_mode": "tukey", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css", "inline:\n                .tooltip .value {\n                    font-size: 1em !important;\n                }\n                .axis text {\n                    font-size: 9px !important;\n                }\n            "], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": false, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 600, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["file:///home/milesg/miniconda3/envs/gilknocker/lib/python3.8/site-packages/pygaljs/static/2.0.x/pygal-tooltips.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 20, "min_scale": 20, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": [697, 1598], "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": false, "show_minor_x_labels": true, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "rgba(249, 249, 249, 1)", "ci_colors": [], "colors": ["#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5"], "dot_opacity": "1", "font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "foreground": "rgba(0, 0, 0, .87)", "foreground_strong": "rgba(0, 0, 0, 1)", "foreground_subtle": "rgba(0, 0, 0, .54)", "guide_stroke_color": "black", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "legend_font_size": 14, "major_guide_stroke_color": "black", "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "no_data_font_size": 64, "opacity": ".7", "opacity_hover": ".8", "plot_background": "rgba(255, 255, 255, 1)", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "stroke_width": "1", "stroke_width_hover": "4", "title_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "tooltip_font_size": 14, "transition": "150ms", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "value_label_font_size": 10}, "title": "Speed in Milliseconds (ms)", "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": 50, "truncate_legend": null, "width": 800, "x_label_rotation": 270, "x_labels": ["test_bench[a_lotta_gil-None]", "test_bench[a_lotta_gil-10]", "test_bench[a_lotta_gil-1000]", "test_bench[a_lotta_gil-10000]", "test_bench[a_lotta_gil-100000]", "test_bench[a_lotta_gil-100]", "test_bench[a_little_gil-None]", "test_bench[a_little_gil-100000]", "test_bench[a_little_gil-10000]", "test_bench[a_little_gil-1000]", "test_bench[a_little_gil-100]", "test_bench[a_little_gil-10]"], "x_labels_major": null, "x_labels_major_count": null, "x_labels_major_every": null, "x_title": "Trial", "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": "Duration", "zero": 697, "legends": ["benchmarks/test_knockknock.py::test_bench[a_lotta_gil-None] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_lotta_gil-10] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_lotta_gil-1000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_lotta_gil-10000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_lotta_gil-100000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_lotta_gil-100] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-None] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-100000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-10000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-1000] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-100] - 5 rounds", "benchmarks/test_knockknock.py::test_bench[a_little_gil-10] - 5 rounds"]}</script><script type="text/javascript">(function() {
+<svg xmlns="http://www.w3.org/2000/svg" id="chart-37b1351f-0d70-4862-a043-8192de36f44e" class="pygal-chart" viewBox="0 0 800 600"><!--Generated with pygal 3.0.0 (etree) ©Kozea 2012-2016 on 2023-03-15--><!--http://pygal.org--><!--http://github.com/Kozea/pygal--><defs><style type="text/css">#chart-37b1351f-0d70-4862-a043-8192de36f44e{-webkit-user-select:none;-webkit-font-smoothing:antialiased;font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace}#chart-37b1351f-0d70-4862-a043-8192de36f44e .title{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:16px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .legends .legend text{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:14px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis text{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis text.major{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay text.value{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:16px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay text.label{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:10px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:14px}#chart-37b1351f-0d70-4862-a043-8192de36f44e text.no_data{font-family:Consolas,"Deja Vu Sans Mono","Bitstream Vera Sans Mono","Courier New",monospace;font-size:64px}
+#chart-37b1351f-0d70-4862-a043-8192de36f44e{background-color:rgba(249,249,249,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e path,#chart-37b1351f-0d70-4862-a043-8192de36f44e line,#chart-37b1351f-0d70-4862-a043-8192de36f44e rect,#chart-37b1351f-0d70-4862-a043-8192de36f44e circle{-webkit-transition:150ms;-moz-transition:150ms;transition:150ms}#chart-37b1351f-0d70-4862-a043-8192de36f44e .graph &gt; .background{fill:rgba(249,249,249,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .plot &gt; .background{fill:rgba(255,255,255,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .graph{fill:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e text.no_data{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .title{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .legends .legend text{fill:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .legends .legend:hover text{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .line{stroke:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .guide.line{stroke:rgba(0,0,0,.54)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .major.line{stroke:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis text.major{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y .guides:hover .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .line-graph .axis.x .guides:hover .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .stackedline-graph .axis.x .guides:hover .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .xy-graph .axis.x .guides:hover .guide.line{stroke:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .guides:hover text{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .reactive{fill-opacity:.7;stroke-opacity:.8;stroke-width:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .ci{stroke:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .reactive.active,#chart-37b1351f-0d70-4862-a043-8192de36f44e .active .reactive{fill-opacity:.8;stroke-opacity:.9;stroke-width:4}#chart-37b1351f-0d70-4862-a043-8192de36f44e .ci .reactive.active{stroke-width:1.5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .series text{fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip rect{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,1);-webkit-transition:opacity 150ms;-moz-transition:opacity 150ms;transition:opacity 150ms}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .label{fill:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .label{fill:rgba(0,0,0,.87)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .legend{font-size:.8em;fill:rgba(0,0,0,.54)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .x_label{font-size:.6em;fill:rgba(0,0,0,1)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .xlink{font-size:.5em;text-decoration:underline}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip .value{font-size:1.5em}#chart-37b1351f-0d70-4862-a043-8192de36f44e .bound{font-size:.5em}#chart-37b1351f-0d70-4862-a043-8192de36f44e .max-value{font-size:.75em;fill:rgba(0,0,0,.54)}#chart-37b1351f-0d70-4862-a043-8192de36f44e .map-element{fill:rgba(255,255,255,1);stroke:rgba(0,0,0,.54) !important}#chart-37b1351f-0d70-4862-a043-8192de36f44e .map-element .reactive{fill-opacity:inherit;stroke-opacity:inherit}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-0,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-0 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-1,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-1 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-2,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-2 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-3,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-3 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-4,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-4 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-5,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-5 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-6,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-6 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-7,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-7 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-8,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-8 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-9,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-9 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-10,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-10 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-11,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-11 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-12,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-12 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-13,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-13 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-14,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-14 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-15,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-15 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-16,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-16 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-17,#chart-37b1351f-0d70-4862-a043-8192de36f44e .color-17 a:visited{stroke:#3F51B5;fill:#3F51B5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-0 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-1 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-2 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-3 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-4 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-5 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-6 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-7 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-8 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-9 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-10 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-11 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-12 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-13 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-14 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-15 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-16 text{fill:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .text-overlay .color-17 text{fill:black}
+#chart-37b1351f-0d70-4862-a043-8192de36f44e text.no_data{text-anchor:middle}#chart-37b1351f-0d70-4862-a043-8192de36f44e .guide.line{fill:none}#chart-37b1351f-0d70-4862-a043-8192de36f44e .centered{text-anchor:middle}#chart-37b1351f-0d70-4862-a043-8192de36f44e .title{text-anchor:middle}#chart-37b1351f-0d70-4862-a043-8192de36f44e .legends .legend text{fill-opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.x text{text-anchor:middle}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.x:not(.web) text[transform]{text-anchor:start}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.x:not(.web) text[transform].backwards{text-anchor:end}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y text{text-anchor:end}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y text[transform].backwards{text-anchor:start}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y2 text{text-anchor:start}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y2 text[transform].backwards{text-anchor:end}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .guide.line{stroke-dasharray:4,4;stroke:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .major.guide.line{stroke-dasharray:6,6;stroke:black}#chart-37b1351f-0d70-4862-a043-8192de36f44e .horizontal .axis.y .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .horizontal .axis.y2 .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .vertical .axis.x .guide.line{opacity:0}#chart-37b1351f-0d70-4862-a043-8192de36f44e .horizontal .axis.always_show .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .vertical .axis.always_show .guide.line{opacity:1 !important}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y .guides:hover .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.y2 .guides:hover .guide.line,#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis.x .guides:hover .guide.line{opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .axis .guides:hover text{opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .nofill{fill:none}#chart-37b1351f-0d70-4862-a043-8192de36f44e .subtle-fill{fill-opacity:.2}#chart-37b1351f-0d70-4862-a043-8192de36f44e .dot{stroke-width:1px;fill-opacity:1;stroke-opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .dot.active{stroke-width:5px}#chart-37b1351f-0d70-4862-a043-8192de36f44e .dot.negative{fill:transparent}#chart-37b1351f-0d70-4862-a043-8192de36f44e text,#chart-37b1351f-0d70-4862-a043-8192de36f44e tspan{stroke:none !important}#chart-37b1351f-0d70-4862-a043-8192de36f44e .series text.active{opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip rect{fill-opacity:.95;stroke-width:.5}#chart-37b1351f-0d70-4862-a043-8192de36f44e .tooltip text{fill-opacity:1}#chart-37b1351f-0d70-4862-a043-8192de36f44e .showable{visibility:hidden}#chart-37b1351f-0d70-4862-a043-8192de36f44e .showable.shown{visibility:visible}#chart-37b1351f-0d70-4862-a043-8192de36f44e .gauge-background{fill:rgba(229,229,229,1);stroke:none}#chart-37b1351f-0d70-4862-a043-8192de36f44e .bg-lines{stroke:rgba(249,249,249,1);stroke-width:2px}
+.tooltip .value{font-size:1em !important}.axis text{font-size:9px !important}</style><script type="text/javascript">window.pygal = window.pygal || {};window.pygal.config = window.pygal.config || {};window.pygal.config['37b1351f-0d70-4862-a043-8192de36f44e'] = {"allow_interruptions": false, "box_mode": "tukey", "classes": ["pygal-chart"], "css": ["file://style.css", "file://graph.css", "inline:\n                .tooltip .value {\n                    font-size: 1em !important;\n                }\n                .axis text {\n                    font-size: 9px !important;\n                }\n            "], "defs": [], "disable_xml_declaration": false, "dots_size": 2.5, "dynamic_print_values": false, "explicit_size": false, "fill": false, "force_uri_protocol": "https", "formatter": null, "half_pie": false, "height": 600, "include_x_axis": false, "inner_radius": 0, "interpolate": null, "interpolation_parameters": {}, "interpolation_precision": 250, "inverse_y_axis": false, "js": ["file:///home/milesg/mambaforge/envs/gilknocker/lib/python3.9/site-packages/pygaljs/static/2.0.x/pygal-tooltips.js"], "legend_at_bottom": false, "legend_at_bottom_columns": null, "legend_box_size": 12, "logarithmic": false, "margin": 20, "margin_bottom": null, "margin_left": null, "margin_right": null, "margin_top": null, "max_scale": 20, "min_scale": 20, "missing_value_fill_truncation": "x", "no_data_text": "No data", "no_prefix": false, "order_min": null, "pretty_print": false, "print_labels": false, "print_values": false, "print_values_position": "center", "print_zeroes": true, "range": [0, 2], "rounded_bars": null, "secondary_range": null, "show_dots": true, "show_legend": false, "show_minor_x_labels": true, "show_minor_y_labels": true, "show_only_major_dots": false, "show_x_guides": false, "show_x_labels": true, "show_y_guides": true, "show_y_labels": true, "spacing": 10, "stack_from_top": false, "strict": false, "stroke": true, "stroke_style": null, "style": {"background": "rgba(249, 249, 249, 1)", "ci_colors": [], "colors": ["#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5", "#3F51B5"], "dot_opacity": "1", "font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "foreground": "rgba(0, 0, 0, .87)", "foreground_strong": "rgba(0, 0, 0, 1)", "foreground_subtle": "rgba(0, 0, 0, .54)", "guide_stroke_color": "black", "guide_stroke_dasharray": "4,4", "label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "label_font_size": 10, "legend_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "legend_font_size": 14, "major_guide_stroke_color": "black", "major_guide_stroke_dasharray": "6,6", "major_label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "major_label_font_size": 10, "no_data_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "no_data_font_size": 64, "opacity": ".7", "opacity_hover": ".8", "plot_background": "rgba(255, 255, 255, 1)", "stroke_opacity": ".8", "stroke_opacity_hover": ".9", "stroke_width": "1", "stroke_width_hover": "4", "title_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "title_font_size": 16, "tooltip_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "tooltip_font_size": 14, "transition": "150ms", "value_background": "rgba(229, 229, 229, 1)", "value_colors": [], "value_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "value_font_size": 16, "value_label_font_family": "Consolas, \"Deja Vu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Courier New\", monospace", "value_label_font_size": 10}, "title": "Speed in Seconds", "tooltip_border_radius": 0, "tooltip_fancy_mode": true, "truncate_label": 50, "truncate_legend": null, "width": 800, "x_label_rotation": 270, "x_labels": ["test_bench[a_little_gil-100000]", "test_bench[a_little_gil-10000]", "test_bench[a_little_gil-1000]", "test_bench[a_little_gil-100]", "test_bench[a_little_gil-10]", "test_bench[a_little_gil-None]", "test_bench[a_lotta_gil-100000]", "test_bench[a_lotta_gil-10000]", "test_bench[a_lotta_gil-1000]", "test_bench[a_lotta_gil-100]", "test_bench[a_lotta_gil-10]", "test_bench[a_lotta_gil-None]", "test_bench[some_gil-100000]", "test_bench[some_gil-10000]", "test_bench[some_gil-1000]", "test_bench[some_gil-100]", "test_bench[some_gil-10]", "test_bench[some_gil-None]"], "x_labels_major": null, "x_labels_major_count": null, "x_labels_major_every": null, "x_title": "Trial", "xrange": null, "y_label_rotation": 0, "y_labels": null, "y_labels_major": null, "y_labels_major_count": null, "y_labels_major_every": null, "y_title": "Duration", "zero": 0, "legends": ["benchmarks/test_bench.py::test_bench[a_little_gil-100000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_little_gil-10000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_little_gil-1000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_little_gil-100] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_little_gil-10] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_little_gil-None] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-100000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-10000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-1000] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-100] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-10] - 5 rounds", "benchmarks/test_bench.py::test_bench[a_lotta_gil-None] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-100000] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-10000] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-1000] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-100] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-10] - 5 rounds", "benchmarks/test_bench.py::test_bench[some_gil-None] - 5 rounds"]}</script><script type="text/javascript">(function() {
   var $, get_translation, init, init_svg, matches, padding, r_translation, sibl, svg_ns, tooltip_timeout, xlink_ns;
 
   svg_ns = 'http://www.w3.org/2000/svg';
@@ -345,76 +345,112 @@
   window.pygal.init_svg = init_svg;
 
 }).call(this);
-</script></defs><title>Speed in Milliseconds (ms)</title><g class="graph custombox-graph vertical"><rect x="0" y="0" width="800" height="600" class="background" /><g transform="translate(80, 46)" class="plot"><rect x="0" y="0" width="700.0" height="312.0" class="background" /><g class="axis y always_show"><path d="M0.000000 312.000000 h700.000000" class="line" /><g class="guides"><path d="M0.000000 298.341842 h700.000000" class="guide line" /><text x="-5" y="301.8418423973363" class="">720</text><title>720</title></g><g class="guides"><path d="M0.000000 271.704772 h700.000000" class="guide line" /><text x="-5" y="275.20477247502777" class="">800</text><title>800</title></g><g class="guides"><path d="M0.000000 245.067703 h700.000000" class="guide line" /><text x="-5" y="248.5677025527192" class="">880</text><title>880</title></g><g class="guides"><path d="M0.000000 218.430633 h700.000000" class="guide line" /><text x="-5" y="221.93063263041066" class="">960</text><title>960</title></g><g class="guides"><path d="M0.000000 191.793563 h700.000000" class="guide line" /><text x="-5" y="195.29356270810212" class="">1040</text><title>1040</title></g><g class="guides"><path d="M0.000000 165.156493 h700.000000" class="guide line" /><text x="-5" y="168.65649278579357" class="">1120</text><title>1120</title></g><g class="guides"><path d="M0.000000 138.519423 h700.000000" class="guide line" /><text x="-5" y="142.01942286348503" class="">1200</text><title>1200</title></g><g class="guides"><path d="M0.000000 111.882353 h700.000000" class="guide line" /><text x="-5" y="115.38235294117646" class="">1280</text><title>1280</title></g><g class="guides"><path d="M0.000000 85.245283 h700.000000" class="guide line" /><text x="-5" y="88.74528301886792" class="">1360</text><title>1360</title></g><g class="guides"><path d="M0.000000 58.608213 h700.000000" class="guide line" /><text x="-5" y="62.10821309655938" class="">1440</text><title>1440</title></g><g class="guides"><path d="M0.000000 31.971143 h700.000000" class="guide line" /><text x="-5" y="35.47114317425081" class="">1520</text><title>1520</title></g></g><g class="axis x"><path d="M0.000000 0.000000 v312.000000" class="line" /><g class="guides"><path d="M41.506410 0.000000 v312.000000" class="guide line" /><text x="41.506410256410255" y="327.0" class="backwards" transform="rotate(270 41.506410 327.000000)">test_bench[a_lotta_gil-None]</text></g><g class="guides"><path d="M97.596154 0.000000 v312.000000" class="guide line" /><text x="97.59615384615384" y="327.0" class="backwards" transform="rotate(270 97.596154 327.000000)">test_bench[a_lotta_gil-10]</text></g><g class="guides"><path d="M153.685897 0.000000 v312.000000" class="guide line" /><text x="153.68589743589743" y="327.0" class="backwards" transform="rotate(270 153.685897 327.000000)">test_bench[a_lotta_gil-1000]</text></g><g class="guides"><path d="M209.775641 0.000000 v312.000000" class="guide line" /><text x="209.77564102564105" y="327.0" class="backwards" transform="rotate(270 209.775641 327.000000)">test_bench[a_lotta_gil-10000]</text></g><g class="guides"><path d="M265.865385 0.000000 v312.000000" class="guide line" /><text x="265.8653846153846" y="327.0" class="backwards" transform="rotate(270 265.865385 327.000000)">test_bench[a_lotta_gil-100000]</text></g><g class="guides"><path d="M321.955128 0.000000 v312.000000" class="guide line" /><text x="321.9551282051282" y="327.0" class="backwards" transform="rotate(270 321.955128 327.000000)">test_bench[a_lotta_gil-100]</text></g><g class="guides"><path d="M378.044872 0.000000 v312.000000" class="guide line" /><text x="378.04487179487177" y="327.0" class="backwards" transform="rotate(270 378.044872 327.000000)">test_bench[a_little_gil-None]</text></g><g class="guides"><path d="M434.134615 0.000000 v312.000000" class="guide line" /><text x="434.13461538461536" y="327.0" class="backwards" transform="rotate(270 434.134615 327.000000)">test_bench[a_little_gil-100000]</text></g><g class="guides"><path d="M490.224359 0.000000 v312.000000" class="guide line" /><text x="490.224358974359" y="327.0" class="backwards" transform="rotate(270 490.224359 327.000000)">test_bench[a_little_gil-10000]</text></g><g class="guides"><path d="M546.314103 0.000000 v312.000000" class="guide line" /><text x="546.3141025641025" y="327.0" class="backwards" transform="rotate(270 546.314103 327.000000)">test_bench[a_little_gil-1000]</text></g><g class="guides"><path d="M602.403846 0.000000 v312.000000" class="guide line" /><text x="602.4038461538462" y="327.0" class="backwards" transform="rotate(270 602.403846 327.000000)">test_bench[a_little_gil-100]</text></g><g class="guides"><path d="M658.493590 0.000000 v312.000000" class="guide line" /><text x="658.4935897435897" y="327.0" class="backwards" transform="rotate(270 658.493590 327.000000)">test_bench[a_little_gil-10]</text></g></g><g class="series serie-0 color-0"><g class="boxes"><g class="box"><path stroke-width="3" d="M29.166667 305.772645 L53.846154 305.772645" class="reactive tooltip-trigger" /><path stroke-width="3" d="M16.826923 279.320760 L66.185897 279.320760" class="reactive tooltip-trigger" /><path stroke-width="3" d="M29.166667 270.193043 L53.846154 270.193043" class="reactive tooltip-trigger" /><path stroke-width="2" d="M41.506410 305.772645 L41.506410 305.290721" class="reactive tooltip-trigger" /><path stroke-width="2" d="M41.506410 270.193043 L41.506410 271.444710" class="reactive tooltip-trigger" /><rect x="16.826923076923077" y="271.4447098505767" height="33.84601098753427" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="41.506410256410255" cy="305.77264461696996" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="41.506410256410255" cy="270.1930428411525" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 697.6828
-Q1-1.5IQR: 697.6828
-Q1: 699.1302
-Median: 777.1266
-Q3: 800.7811
-Q3+1.5IQR: 804.5402
-Max: 804.5402</desc><desc class="x centered">41.506410256410255</desc><desc class="y centered">286.40437568273364</desc><desc class="x_label" /></g></g></g><g class="series serie-1 color-1"><g class="boxes"><g class="box"><path stroke-width="3" d="M85.256410 302.653297 L109.935897 302.653297" class="reactive tooltip-trigger" /><path stroke-width="3" d="M72.916667 299.937300 L122.275641 299.937300" class="reactive tooltip-trigger" /><path stroke-width="3" d="M85.256410 296.891729 L109.935897 296.891729" class="reactive tooltip-trigger" /><path stroke-width="2" d="M97.596154 302.653297 L97.596154 302.149304" class="reactive tooltip-trigger" /><path stroke-width="2" d="M97.596154 296.891729 L97.596154 298.801540" class="reactive tooltip-trigger" /><rect x="72.91666666666667" y="298.8015396226819" height="3.34776476101797" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="97.59615384615385" cy="302.653296891503" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="97.59615384615385" cy="296.8917286349166" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 707.0513
-Q1-1.5IQR: 707.0513
-Q1: 708.5649
-Median: 715.2083
-Q3: 718.6194
-Q3+1.5IQR: 724.3552
-Max: 724.3552</desc><desc class="x centered">97.59615384615385</desc><desc class="y centered">300.08663397315286</desc><desc class="x_label" /></g></g></g><g class="series serie-2 color-2"><g class="boxes"><g class="box"><path stroke-width="3" d="M141.346154 302.326582 L166.025641 302.326582" class="reactive tooltip-trigger" /><path stroke-width="3" d="M129.006410 297.752266 L178.365385 297.752266" class="reactive tooltip-trigger" /><path stroke-width="3" d="M141.346154 290.864691 L166.025641 290.864691" class="reactive tooltip-trigger" /><path stroke-width="2" d="M153.685897 302.326582 L153.685897 300.133851" class="reactive tooltip-trigger" /><path stroke-width="2" d="M153.685897 290.864691 L153.685897 295.960392" class="reactive tooltip-trigger" /><rect x="129.00641025641028" y="295.96039220388184" height="4.173459155764533" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="153.68589743589746" cy="302.3265822426461" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="153.68589743589746" cy="290.8646913429346" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 708.0325
-Q1-1.5IQR: 708.0325
-Q1: 714.6180
-Median: 721.7707
-Q3: 727.1523
-Q3+1.5IQR: 742.4564
-Max: 742.4564</desc><desc class="x centered">153.68589743589746</desc><desc class="y centered">297.40755665938195</desc><desc class="x_label" /></g></g></g><g class="series serie-3 color-3"><g class="boxes"><g class="box"><path stroke-width="3" d="M197.435897 299.634789 L222.115385 299.634789" class="reactive tooltip-trigger" /><path stroke-width="3" d="M185.096154 299.096162 L234.455128 299.096162" class="reactive tooltip-trigger" /><path stroke-width="3" d="M197.435897 274.404955 L222.115385 274.404955" class="reactive tooltip-trigger" /><path stroke-width="2" d="M209.775641 299.634789 L209.775641 299.423424" class="reactive tooltip-trigger" /><path stroke-width="2" d="M209.775641 274.404955 L209.775641 291.681507" class="reactive tooltip-trigger" /><rect x="185.09615384615384" y="291.68150677102506" height="7.741916786746401" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="209.77564102564102" cy="299.63478945670795" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="209.77564102564102" cy="274.40495493980234" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 716.1168
-Q1-1.5IQR: 716.1168
-Q1: 716.7517
-Median: 717.7345
-Q3: 740.0032
-Q3+1.5IQR: 791.8905
-Max: 791.8905</desc><desc class="x centered">209.77564102564102</desc><desc class="y centered">292.8481673313478</desc><desc class="x_label" /></g></g></g><g class="series serie-4 color-4"><g class="boxes"><g class="box"><path stroke-width="3" d="M253.525641 285.614393 L278.205128 285.614393" class="reactive tooltip-trigger" /><path stroke-width="3" d="M241.185897 285.384781 L290.544872 285.384781" class="reactive tooltip-trigger" /><path stroke-width="3" d="M253.525641 284.876018 L278.205128 284.876018" class="reactive tooltip-trigger" /><path stroke-width="2" d="M265.865385 285.614393 L265.865385 285.450402" class="reactive tooltip-trigger" /><path stroke-width="2" d="M265.865385 284.876018 L265.865385 285.047056" class="reactive tooltip-trigger" /><rect x="241.18589743589743" y="285.0470556318123" height="0.4033461714692521" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="265.8653846153846" cy="285.6143933412796" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="265.8653846153846" cy="284.87601842348874" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 758.2248
-Q1-1.5IQR: 758.2248
-Q1: 758.7173
-Median: 758.9144
-Q3: 759.9287
-Q3+1.5IQR: 760.4424
-Max: 760.4424</desc><desc class="x centered">265.8653846153846</desc><desc class="y centered">285.27453006659005</desc><desc class="x_label" /></g></g></g><g class="series serie-5 color-5"><g class="boxes"><g class="box"><path stroke-width="3" d="M309.615385 284.730727 L334.294872 284.730727" class="reactive tooltip-trigger" /><path stroke-width="3" d="M297.275641 283.863813 L346.634615 283.863813" class="reactive tooltip-trigger" /><path stroke-width="3" d="M309.615385 258.668384 L334.294872 258.668384" class="reactive tooltip-trigger" /><path stroke-width="2" d="M321.955128 284.730727 L321.955128 284.293830" class="reactive tooltip-trigger" /><path stroke-width="2" d="M321.955128 258.668384 L321.955128 277.494746" class="reactive tooltip-trigger" /><rect x="297.27564102564105" y="277.49474550510246" height="6.799084877880034" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="321.95512820512823" cy="284.73072719239434" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="321.95512820512823" cy="258.6683836848573" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 760.8787
-Q1-1.5IQR: 760.8787
-Q1: 762.1909
-Median: 763.4823
-Q3: 782.6108
-Q3+1.5IQR: 839.1526
-Max: 839.1526</desc><desc class="x centered">321.95512820512823</desc><desc class="y centered">277.8102999057401</desc><desc class="x_label" /></g></g></g><g class="series serie-6 color-6"><g class="boxes"><g class="box"><path stroke-width="3" d="M365.705128 36.899358 L390.384615 36.899358" class="reactive tooltip-trigger" /><path stroke-width="3" d="M353.365385 35.892501 L402.724359 35.892501" class="reactive tooltip-trigger" /><path stroke-width="3" d="M365.705128 35.226385 L390.384615 35.226385" class="reactive tooltip-trigger" /><path stroke-width="2" d="M378.044872 36.899358 L378.044872 36.328693" class="reactive tooltip-trigger" /><path stroke-width="2" d="M378.044872 35.226385 L378.044872 35.493823" class="reactive tooltip-trigger" /><rect x="353.36538461538464" y="35.49382291926372" height="0.8348698667697363" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="378.0448717948718" cy="36.89935771349457" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="378.0448717948718" cy="35.22638457245347" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1505.1989
-Q1-1.5IQR: 1505.1989
-Q1: 1506.9128
-Median: 1508.2229
-Q3: 1509.4202
-Q3+1.5IQR: 1510.2234
-Max: 1510.2234</desc><desc class="x centered">378.0448717948718</desc><desc class="y centered">35.96815182010448</desc><desc class="x_label" /></g></g></g><g class="series serie-7 color-7"><g class="boxes"><g class="box"><path stroke-width="3" d="M421.794872 36.630856 L446.474359 36.630856" class="reactive tooltip-trigger" /><path stroke-width="3" d="M409.455128 30.462131 L458.814103 30.462131" class="reactive tooltip-trigger" /><path stroke-width="3" d="M421.794872 18.850685 L446.474359 18.850685" class="reactive tooltip-trigger" /><path stroke-width="2" d="M434.134615 36.630856 L434.134615 34.032434" class="reactive tooltip-trigger" /><path stroke-width="2" d="M434.134615 18.850685 L434.134615 21.120036" class="reactive tooltip-trigger" /><rect x="409.45512820512823" y="21.12003612654945" height="12.912398224226365" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="434.1346153846154" cy="36.63085571575982" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="434.1346153846154" cy="18.850685127272754" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1506.0053
-Q1-1.5IQR: 1506.0053
-Q1: 1513.8093
-Median: 1524.5321
-Q3: 1552.5895
-Q3+1.5IQR: 1559.4051
-Max: 1559.4051</desc><desc class="x centered">434.1346153846154</desc><desc class="y centered">28.219228434985496</desc><desc class="x_label" /></g></g></g><g class="series serie-8 color-8"><g class="boxes"><g class="box"><path stroke-width="3" d="M477.884615 35.644191 L502.564103 35.644191" class="reactive tooltip-trigger" /><path stroke-width="3" d="M465.544872 33.734761 L514.903846 33.734761" class="reactive tooltip-trigger" /><path stroke-width="3" d="M477.884615 31.607804 L502.564103 31.607804" class="reactive tooltip-trigger" /><path stroke-width="2" d="M490.224359 35.644191 L490.224359 35.286125" class="reactive tooltip-trigger" /><path stroke-width="2" d="M490.224359 31.607804 L490.224359 31.834192" class="reactive tooltip-trigger" /><rect x="465.5448717948718" y="31.8341917599966" height="3.451933268411892" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="490.224358974359" cy="35.644190676430355" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="490.224358974359" cy="31.607803551941856" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1508.9686
-Q1-1.5IQR: 1508.9686
-Q1: 1510.0440
-Median: 1514.7033
-Q3: 1520.4113
-Q3+1.5IQR: 1521.0912
-Max: 1521.0912</desc><desc class="x centered">490.224358974359</desc><desc class="y centered">33.62141438983355</desc><desc class="x_label" /></g></g></g><g class="series serie-9 color-9"><g class="boxes"><g class="box"><path stroke-width="3" d="M533.974359 27.294720 L558.653846 27.294720" class="reactive tooltip-trigger" /><path stroke-width="3" d="M521.634615 25.784418 L570.993590 25.784418" class="reactive tooltip-trigger" /><path stroke-width="3" d="M533.974359 25.102231 L558.653846 25.102231" class="reactive tooltip-trigger" /><path stroke-width="2" d="M546.314103 27.294720 L546.314103 26.596470" class="reactive tooltip-trigger" /><path stroke-width="2" d="M546.314103 25.102231 L546.314103 25.455693" class="reactive tooltip-trigger" /><rect x="521.6346153846155" y="25.455693396188735" height="1.1407767200294074" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="546.3141025641027" cy="27.29471953400099" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="546.3141025641027" cy="25.102230632413296" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1534.0449
-Q1-1.5IQR: 1534.0449
-Q1: 1536.1419
-Median: 1538.5808
-Q3: 1539.5681
-Q3+1.5IQR: 1540.6296
-Max: 1540.6296</desc><desc class="x centered">546.3141025641027</desc><desc class="y centered">26.046706265260127</desc><desc class="x_label" /></g></g></g><g class="series serie-10 color-10"><g class="boxes"><g class="box"><path stroke-width="3" d="M590.064103 16.517372 L614.743590 16.517372" class="reactive tooltip-trigger" /><path stroke-width="3" d="M577.724359 16.178798 L627.083333 16.178798" class="reactive tooltip-trigger" /><path stroke-width="3" d="M590.064103 13.237485 L614.743590 13.237485" class="reactive tooltip-trigger" /><path stroke-width="2" d="M602.403846 16.517372 L602.403846 16.343062" class="reactive tooltip-trigger" /><path stroke-width="2" d="M602.403846 13.237485 L602.403846 14.575467" class="reactive tooltip-trigger" /><rect x="577.724358974359" y="14.575466953299667" height="1.7675950892490278" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="602.4038461538462" cy="16.517372364328423" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="602.4038461538462" cy="13.237485348537462" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1566.4128
-Q1-1.5IQR: 1566.4128
-Q1: 1566.9363
-Median: 1567.4297
-Q3: 1572.2450
-Q3+1.5IQR: 1576.2634
-Max: 1576.2634</desc><desc class="x centered">602.4038461538462</desc><desc class="y centered">15.370436986531558</desc><desc class="x_label" /></g></g></g><g class="series serie-11 color-11"><g class="boxes"><g class="box"><path stroke-width="3" d="M646.153846 9.613623 L670.833333 9.613623" class="reactive tooltip-trigger" /><path stroke-width="3" d="M633.814103 8.250524 L683.173077 8.250524" class="reactive tooltip-trigger" /><path stroke-width="3" d="M646.153846 6.235748 L670.833333 6.235748" class="reactive tooltip-trigger" /><path stroke-width="2" d="M658.493590 9.613623 L658.493590 8.597195" class="reactive tooltip-trigger" /><path stroke-width="2" d="M658.493590 6.235748 L658.493590 7.200671" class="reactive tooltip-trigger" /><rect x="633.8141025641025" y="7.200671003753712" height="1.396523807706103" width="49.35897435897436" class="subtle-fill reactive tooltip-trigger" /><circle cx="658.4935897435897" cy="9.613623196534206" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="658.4935897435897" cy="6.235748390895708" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1587.1471
-Q1-1.5IQR: 1587.1471
-Q1: 1590.1998
-Median: 1591.2409
-Q3: 1594.3940
-Q3+1.5IQR: 1597.2920
-Max: 1597.2920</desc><desc class="x centered">658.4935897435897</desc><desc class="y centered">7.979552230900708</desc><desc class="x_label" /></g></g></g></g><g class="titles"><text x="400.0" y="26" class="title plot_title">Speed in Milliseconds (ms)</text><text x="430.0" y="580.0" class="title">Trial</text><text x="0" y="228.0" class="title" transform="rotate(-90 0.000000 202.000000)">Duration</text></g><g transform="translate(80, 46)" class="plot overlay"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /><g class="series serie-3 color-3" /><g class="series serie-4 color-4" /><g class="series serie-5 color-5" /><g class="series serie-6 color-6" /><g class="series serie-7 color-7" /><g class="series serie-8 color-8" /><g class="series serie-9 color-9" /><g class="series serie-10 color-10" /><g class="series serie-11 color-11" /></g><g transform="translate(80, 46)" class="plot text-overlay"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /><g class="series serie-3 color-3" /><g class="series serie-4 color-4" /><g class="series serie-5 color-5" /><g class="series serie-6 color-6" /><g class="series serie-7 color-7" /><g class="series serie-8 color-8" /><g class="series serie-9 color-9" /><g class="series serie-10 color-10" /><g class="series serie-11 color-11" /></g><g transform="translate(80, 46)" class="plot tooltip-overlay"><g transform="translate(0 0)" style="opacity: 0" class="tooltip"><rect rx="0" ry="0" width="0" height="0" class="tooltip-box" /><g class="text" /></g></g></g></svg>
\ No newline at end of file
+</script></defs><title>Speed in Seconds</title><g class="graph custombox-graph vertical"><rect x="0" y="0" width="800" height="600" class="background" /><g transform="translate(74, 46)" class="plot"><rect x="0" y="0" width="706.0" height="312.0" class="background" /><g class="axis y always_show"><g class="guides"><path d="M0.000000 306.000000 h706.000000" class="axis major line" /><text x="-5" y="309.5" class="major">0</text><title>0</title></g><g class="guides"><path d="M0.000000 291.000000 h706.000000" class="guide line" /><text x="-5" y="294.5" class="">0.1</text><title>0.1</title></g><g class="guides"><path d="M0.000000 276.000000 h706.000000" class="guide line" /><text x="-5" y="279.5" class="">0.2</text><title>0.2</title></g><g class="guides"><path d="M0.000000 261.000000 h706.000000" class="guide line" /><text x="-5" y="264.5" class="">0.3</text><title>0.3</title></g><g class="guides"><path d="M0.000000 246.000000 h706.000000" class="guide line" /><text x="-5" y="249.5" class="">0.4</text><title>0.4</title></g><g class="guides"><path d="M0.000000 231.000000 h706.000000" class="major guide line" /><text x="-5" y="234.5" class="major">0.5</text><title>0.5</title></g><g class="guides"><path d="M0.000000 216.000000 h706.000000" class="guide line" /><text x="-5" y="219.5" class="">0.6</text><title>0.6</title></g><g class="guides"><path d="M0.000000 201.000000 h706.000000" class="guide line" /><text x="-5" y="204.5" class="">0.7</text><title>0.7</title></g><g class="guides"><path d="M0.000000 186.000000 h706.000000" class="guide line" /><text x="-5" y="189.5" class="">0.8</text><title>0.8</title></g><g class="guides"><path d="M0.000000 171.000000 h706.000000" class="guide line" /><text x="-5" y="174.5" class="">0.9</text><title>0.9</title></g><g class="guides"><path d="M0.000000 156.000000 h706.000000" class="major guide line" /><text x="-5" y="159.5" class="major">1</text><title>1</title></g><g class="guides"><path d="M0.000000 141.000000 h706.000000" class="guide line" /><text x="-5" y="144.49999999999997" class="">1.1</text><title>1.1</title></g><g class="guides"><path d="M0.000000 126.000000 h706.000000" class="guide line" /><text x="-5" y="129.5" class="">1.2</text><title>1.2</title></g><g class="guides"><path d="M0.000000 111.000000 h706.000000" class="guide line" /><text x="-5" y="114.5" class="">1.3</text><title>1.3</title></g><g class="guides"><path d="M0.000000 96.000000 h706.000000" class="guide line" /><text x="-5" y="99.50000000000003" class="">1.4</text><title>1.4</title></g><g class="guides"><path d="M0.000000 81.000000 h706.000000" class="major guide line" /><text x="-5" y="84.5" class="major">1.5</text><title>1.5</title></g><g class="guides"><path d="M0.000000 66.000000 h706.000000" class="guide line" /><text x="-5" y="69.49999999999997" class="">1.6</text><title>1.6</title></g><g class="guides"><path d="M0.000000 51.000000 h706.000000" class="guide line" /><text x="-5" y="54.5" class="">1.7</text><title>1.7</title></g><g class="guides"><path d="M0.000000 36.000000 h706.000000" class="guide line" /><text x="-5" y="39.5" class="">1.8</text><title>1.8</title></g><g class="guides"><path d="M0.000000 21.000000 h706.000000" class="guide line" /><text x="-5" y="24.5" class="">1.9</text><title>1.9</title></g><g class="guides"><path d="M0.000000 6.000000 h706.000000" class="major guide line" /><text x="-5" y="9.5" class="major">2</text><title>2</title></g></g><g class="axis x"><path d="M0.000000 0.000000 v312.000000" class="line" /><g class="guides"><path d="M32.433761 0.000000 v312.000000" class="guide line" /><text x="32.43376068376068" y="327.0" class="backwards" transform="rotate(270 32.433761 327.000000)">test_bench[a_little_gil-100000]</text></g><g class="guides"><path d="M70.147436 0.000000 v312.000000" class="guide line" /><text x="70.1474358974359" y="327.0" class="backwards" transform="rotate(270 70.147436 327.000000)">test_bench[a_little_gil-10000]</text></g><g class="guides"><path d="M107.861111 0.000000 v312.000000" class="guide line" /><text x="107.8611111111111" y="327.0" class="backwards" transform="rotate(270 107.861111 327.000000)">test_bench[a_little_gil-1000]</text></g><g class="guides"><path d="M145.574786 0.000000 v312.000000" class="guide line" /><text x="145.57478632478632" y="327.0" class="backwards" transform="rotate(270 145.574786 327.000000)">test_bench[a_little_gil-100]</text></g><g class="guides"><path d="M183.288462 0.000000 v312.000000" class="guide line" /><text x="183.28846153846155" y="327.0" class="backwards" transform="rotate(270 183.288462 327.000000)">test_bench[a_little_gil-10]</text></g><g class="guides"><path d="M221.002137 0.000000 v312.000000" class="guide line" /><text x="221.00213675213678" y="327.0" class="backwards" transform="rotate(270 221.002137 327.000000)">test_bench[a_little_gil-None]</text></g><g class="guides"><path d="M258.715812 0.000000 v312.000000" class="guide line" /><text x="258.71581196581195" y="327.0" class="backwards" transform="rotate(270 258.715812 327.000000)">test_bench[a_lotta_gil-100000]</text></g><g class="guides"><path d="M296.429487 0.000000 v312.000000" class="guide line" /><text x="296.4294871794872" y="327.0" class="backwards" transform="rotate(270 296.429487 327.000000)">test_bench[a_lotta_gil-10000]</text></g><g class="guides"><path d="M334.143162 0.000000 v312.000000" class="guide line" /><text x="334.1431623931624" y="327.0" class="backwards" transform="rotate(270 334.143162 327.000000)">test_bench[a_lotta_gil-1000]</text></g><g class="guides"><path d="M371.856838 0.000000 v312.000000" class="guide line" /><text x="371.85683760683764" y="327.0" class="backwards" transform="rotate(270 371.856838 327.000000)">test_bench[a_lotta_gil-100]</text></g><g class="guides"><path d="M409.570513 0.000000 v312.000000" class="guide line" /><text x="409.5705128205129" y="327.0" class="backwards" transform="rotate(270 409.570513 327.000000)">test_bench[a_lotta_gil-10]</text></g><g class="guides"><path d="M447.284188 0.000000 v312.000000" class="guide line" /><text x="447.284188034188" y="327.0" class="backwards" transform="rotate(270 447.284188 327.000000)">test_bench[a_lotta_gil-None]</text></g><g class="guides"><path d="M484.997863 0.000000 v312.000000" class="guide line" /><text x="484.9978632478632" y="327.0" class="backwards" transform="rotate(270 484.997863 327.000000)">test_bench[some_gil-100000]</text></g><g class="guides"><path d="M522.711538 0.000000 v312.000000" class="guide line" /><text x="522.7115384615385" y="327.0" class="backwards" transform="rotate(270 522.711538 327.000000)">test_bench[some_gil-10000]</text></g><g class="guides"><path d="M560.425214 0.000000 v312.000000" class="guide line" /><text x="560.4252136752137" y="327.0" class="backwards" transform="rotate(270 560.425214 327.000000)">test_bench[some_gil-1000]</text></g><g class="guides"><path d="M598.138889 0.000000 v312.000000" class="guide line" /><text x="598.1388888888889" y="327.0" class="backwards" transform="rotate(270 598.138889 327.000000)">test_bench[some_gil-100]</text></g><g class="guides"><path d="M635.852564 0.000000 v312.000000" class="guide line" /><text x="635.8525641025641" y="327.0" class="backwards" transform="rotate(270 635.852564 327.000000)">test_bench[some_gil-10]</text></g><g class="guides"><path d="M673.566239 0.000000 v312.000000" class="guide line" /><text x="673.5662393162394" y="327.0" class="backwards" transform="rotate(270 673.566239 327.000000)">test_bench[some_gil-None]</text></g></g><g class="series serie-0 color-0"><g class="boxes"><g class="box"><path stroke-width="3" d="M24.136752 75.473922 L40.730769 75.473922" class="reactive tooltip-trigger" /><path stroke-width="3" d="M15.839744 66.858520 L49.027778 66.858520" class="reactive tooltip-trigger" /><path stroke-width="3" d="M24.136752 57.061590 L40.730769 57.061590" class="reactive tooltip-trigger" /><path stroke-width="2" d="M32.433761 75.473922 L32.433761 71.829985" class="reactive tooltip-trigger" /><path stroke-width="2" d="M32.433761 57.061590 L32.433761 61.050245" class="reactive tooltip-trigger" /><rect x="15.83974358974359" y="61.05024502499509" height="10.77974006243494" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="32.43376068376068" cy="75.47392229976685" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="32.43376068376068" cy="57.06159015003868" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5368
+Q1-1.5IQR: 1.5368
+Q1: 1.5611
+Median: 1.5943
+Q3: 1.6330
+Q3+1.5IQR: 1.6596
+Max: 1.6596</desc><desc class="x centered">32.43376068376068</desc><desc class="y centered">66.45485246247154</desc><desc class="x_label" /></g></g></g><g class="series serie-1 color-1"><g class="boxes"><g class="box"><path stroke-width="3" d="M61.850427 76.187469 L78.444444 76.187469" class="reactive tooltip-trigger" /><path stroke-width="3" d="M53.553419 71.856391 L86.741453 71.856391" class="reactive tooltip-trigger" /><path stroke-width="3" d="M61.850427 66.159272 L78.444444 66.159272" class="reactive tooltip-trigger" /><path stroke-width="2" d="M70.147436 76.187469 L70.147436 75.794744" class="reactive tooltip-trigger" /><path stroke-width="2" d="M70.147436 66.159272 L70.147436 68.139687" class="reactive tooltip-trigger" /><rect x="53.55341880341879" y="68.13968662493699" height="7.65505695005686" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="70.14743589743588" cy="76.18746870016912" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="70.14743589743588" cy="66.15927150001517" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5321
+Q1-1.5IQR: 1.5321
+Q1: 1.5347
+Median: 1.5610
+Q3: 1.5857
+Q3+1.5IQR: 1.5989
+Max: 1.5989</desc><desc class="x centered">70.14743589743588</desc><desc class="y centered">71.6275123500609</desc><desc class="x_label" /></g></g></g><g class="series serie-2 color-2"><g class="boxes"><g class="box"><path stroke-width="3" d="M99.564103 77.314691 L116.158120 77.314691" class="reactive tooltip-trigger" /><path stroke-width="3" d="M91.267094 76.958524 L124.455128 76.958524" class="reactive tooltip-trigger" /><path stroke-width="3" d="M99.564103 76.536220 L116.158120 76.536220" class="reactive tooltip-trigger" /><path stroke-width="2" d="M107.861111 77.314691 L107.861111 77.097049" class="reactive tooltip-trigger" /><path stroke-width="2" d="M107.861111 76.536220 L107.861111 76.789351" class="reactive tooltip-trigger" /><rect x="91.26709401709401" y="76.78935056244973" height="0.30769807499382296" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="107.8611111111111" cy="77.31469124988143" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="107.8611111111111" cy="76.53621960021701" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5246
+Q1-1.5IQR: 1.5246
+Q1: 1.5260
+Median: 1.5269
+Q3: 1.5281
+Q3+1.5IQR: 1.5298
+Max: 1.5298</desc><desc class="x centered">107.8611111111111</desc><desc class="y centered">76.93916682001691</desc><desc class="x_label" /></g></g></g><g class="series serie-3 color-3"><g class="boxes"><g class="box"><path stroke-width="3" d="M137.277778 73.419905 L153.871795 73.419905" class="reactive tooltip-trigger" /><path stroke-width="3" d="M128.980769 73.007736 L162.168803 73.007736" class="reactive tooltip-trigger" /><path stroke-width="3" d="M137.277778 72.855200 L153.871795 72.855200" class="reactive tooltip-trigger" /><path stroke-width="2" d="M145.574786 73.419905 L145.574786 73.219082" class="reactive tooltip-trigger" /><path stroke-width="2" d="M145.574786 72.855200 L145.574786 72.942379" class="reactive tooltip-trigger" /><rect x="128.98076923076923" y="72.94237852507285" height="0.27670327494888625" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="145.57478632478632" cy="73.41990465015988" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="145.57478632478632" cy="72.85519979982928" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5505
+Q1-1.5IQR: 1.5505
+Q1: 1.5519
+Median: 1.5533
+Q3: 1.5537
+Q3+1.5IQR: 1.5543
+Max: 1.5543</desc><desc class="x centered">145.57478632478632</desc><desc class="y centered">73.0888601250681</desc><desc class="x_label" /></g></g></g><g class="series serie-4 color-4"><g class="boxes"><g class="box"><path stroke-width="3" d="M174.991453 68.049817 L191.585470 68.049817" class="reactive tooltip-trigger" /><path stroke-width="3" d="M166.694444 67.557751 L199.882479 67.557751" class="reactive tooltip-trigger" /><path stroke-width="3" d="M174.991453 64.896877 L191.585470 64.896877" class="reactive tooltip-trigger" /><path stroke-width="2" d="M183.288462 68.049817 L183.288462 68.041283" class="reactive tooltip-trigger" /><path stroke-width="2" d="M183.288462 64.896877 L183.288462 66.380179" class="reactive tooltip-trigger" /><rect x="166.69444444444443" y="66.38017878754545" height="1.6611046874004387" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="183.28846153846152" cy="68.04981705004684" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="183.28846153846152" cy="64.89687720000438" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5863
+Q1-1.5IQR: 1.5863
+Q1: 1.5864
+Median: 1.5896
+Q3: 1.5975
+Q3+1.5IQR: 1.6074
+Max: 1.6074</desc><desc class="x centered">183.28846153846152</desc><desc class="y centered">66.9851814825106</desc><desc class="x_label" /></g></g></g><g class="series serie-5 color-5"><g class="boxes"><g class="box"><path stroke-width="3" d="M212.705128 80.349128 L229.299145 80.349128" class="reactive tooltip-trigger" /><path stroke-width="3" d="M204.408120 80.335311 L237.596154 80.335311" class="reactive tooltip-trigger" /><path stroke-width="3" d="M212.705128 79.987743 L229.299145 79.987743" class="reactive tooltip-trigger" /><path stroke-width="2" d="M221.002137 80.349128 L221.002137 80.341825" class="reactive tooltip-trigger" /><path stroke-width="2" d="M221.002137 79.987743 L221.002137 80.098371" class="reactive tooltip-trigger" /><rect x="204.40811965811963" y="80.0983710375076" height="0.24345397500837862" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="221.00213675213672" cy="80.3491284000811" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="221.00213675213672" cy="79.98774314988259" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5043
+Q1-1.5IQR: 1.5043
+Q1: 1.5044
+Median: 1.5044
+Q3: 1.5060
+Q3+1.5IQR: 1.5067
+Max: 1.5067</desc><desc class="x centered">221.00213675213672</desc><desc class="y centered">80.22247575000256</desc><desc class="x_label" /></g></g></g><g class="series serie-6 color-6"><g class="boxes"><g class="box"><path stroke-width="3" d="M250.418803 194.255269 L267.012821 194.255269" class="reactive tooltip-trigger" /><path stroke-width="3" d="M242.121795 194.144969 L275.309829 194.144969" class="reactive tooltip-trigger" /><path stroke-width="3" d="M250.418803 194.124822 L267.012821 194.124822" class="reactive tooltip-trigger" /><path stroke-width="2" d="M258.715812 194.255269 L258.715812 194.203201" class="reactive tooltip-trigger" /><path stroke-width="2" d="M258.715812 194.124822 L258.715812 194.126281" class="reactive tooltip-trigger" /><rect x="242.12179487179486" y="194.1262809750524" height="0.07692003748616116" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="258.71581196581195" cy="194.25526905002334" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="258.71581196581195" cy="194.1248218500332" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7450
+Q1-1.5IQR: 0.7450
+Q1: 0.7453
+Median: 0.7457
+Q3: 0.7458
+Q3+1.5IQR: 0.7458
+Max: 0.7458</desc><desc class="x centered">258.71581196581195</desc><desc class="y centered">194.17090830754296</desc><desc class="x_label" /></g></g></g><g class="series serie-7 color-7"><g class="boxes"><g class="box"><path stroke-width="3" d="M288.132479 193.931155 L304.726496 193.931155" class="reactive tooltip-trigger" /><path stroke-width="3" d="M279.835470 193.913146 L313.023504 193.913146" class="reactive tooltip-trigger" /><path stroke-width="3" d="M288.132479 184.435996 L304.726496 184.435996" class="reactive tooltip-trigger" /><path stroke-width="2" d="M296.429487 193.931155 L296.429487 193.919011" class="reactive tooltip-trigger" /><path stroke-width="2" d="M296.429487 184.435996 L296.429487 191.394342" class="reactive tooltip-trigger" /><rect x="279.83547008547004" y="191.39434173744667" height="2.524669237436683" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="296.4294871794871" cy="193.9311549000704" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="296.4294871794871" cy="184.43599589987207" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7471
+Q1-1.5IQR: 0.7471
+Q1: 0.7472
+Median: 0.7472
+Q3: 0.7640
+Q3+1.5IQR: 0.8104
+Max: 0.8104</desc><desc class="x centered">296.4294871794871</desc><desc class="y centered">191.5187299424415</desc><desc class="x_label" /></g></g></g><g class="series serie-8 color-8"><g class="boxes"><g class="box"><path stroke-width="3" d="M325.846154 194.028260 L342.440171 194.028260" class="reactive tooltip-trigger" /><path stroke-width="3" d="M317.549145 193.953827 L350.737179 193.953827" class="reactive tooltip-trigger" /><path stroke-width="3" d="M325.846154 193.913776 L342.440171 193.913776" class="reactive tooltip-trigger" /><path stroke-width="2" d="M334.143162 194.028260 L334.143162 194.135136" class="reactive tooltip-trigger" /><path stroke-width="2" d="M334.143162 193.913776 L334.143162 193.939626" class="reactive tooltip-trigger" /><rect x="317.54914529914527" y="193.93962645011106" height="0.19550999998045882" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="334.14316239316236" cy="194.4557672999108" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="334.14316239316236" cy="193.91377574989383" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7436
+Q1-1.5IQR: 0.7465
+Q1: 0.7458
+Median: 0.7470
+Q3: 0.7471
+Q3+1.5IQR: 0.7472
+Max: 0.7472</desc><desc class="x centered">334.14316239316236</desc><desc class="y centered">193.99412505007695</desc><desc class="x_label" /></g></g></g><g class="series serie-9 color-9"><g class="boxes"><g class="box"><path stroke-width="3" d="M363.559829 192.624513 L380.153846 192.624513" class="reactive tooltip-trigger" /><path stroke-width="3" d="M355.262821 191.346009 L388.450855 191.346009" class="reactive tooltip-trigger" /><path stroke-width="3" d="M363.559829 190.794555 L380.153846 190.794555" class="reactive tooltip-trigger" /><path stroke-width="2" d="M371.856838 192.624513 L371.856838 191.730474" class="reactive tooltip-trigger" /><path stroke-width="2" d="M371.856838 190.794555 L371.856838 190.809772" class="reactive tooltip-trigger" /><rect x="355.2628205128205" y="190.80977178751345" height="0.9207027000002199" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="371.8568376068376" cy="192.6245125498608" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="371.8568376068376" cy="190.79455470014727" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7558
+Q1-1.5IQR: 0.7558
+Q1: 0.7618
+Median: 0.7644
+Q3: 0.7679
+Q3+1.5IQR: 0.7680
+Max: 0.7680</desc><desc class="x centered">371.8568376068376</desc><desc class="y centered">191.46106444503948</desc><desc class="x_label" /></g></g></g><g class="series serie-10 color-10"><g class="boxes"><g class="box"><path stroke-width="3" d="M401.273504 192.865240 L417.867521 192.865240" class="reactive tooltip-trigger" /><path stroke-width="3" d="M392.976496 190.969823 L426.164530 190.969823" class="reactive tooltip-trigger" /><path stroke-width="3" d="M401.273504 189.994438 L417.867521 189.994438" class="reactive tooltip-trigger" /><path stroke-width="2" d="M409.570513 192.865240 L409.570513 192.426658" class="reactive tooltip-trigger" /><path stroke-width="2" d="M409.570513 189.994438 L409.570513 190.161448" class="reactive tooltip-trigger" /><rect x="392.97649572649567" y="190.16144842490212" height="2.265209850042993" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="409.57051282051276" cy="192.86524019994977" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="409.57051282051276" cy="189.99443834978229" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7542
+Q1-1.5IQR: 0.7542
+Q1: 0.7572
+Median: 0.7669
+Q3: 0.7723
+Q3+1.5IQR: 0.7734
+Max: 0.7734</desc><desc class="x centered">409.57051282051276</desc><desc class="y centered">191.28352172990253</desc><desc class="x_label" /></g></g></g><g class="series serie-11 color-11"><g class="boxes"><g class="box"><path stroke-width="3" d="M438.987179 194.440977 L455.581197 194.440977" class="reactive tooltip-trigger" /><path stroke-width="3" d="M430.690171 184.886823 L463.878205 184.886823" class="reactive tooltip-trigger" /><path stroke-width="3" d="M438.987179 178.653145 L455.581197 178.653145" class="reactive tooltip-trigger" /><path stroke-width="2" d="M447.284188 194.440977 L447.284188 193.241330" class="reactive tooltip-trigger" /><path stroke-width="2" d="M447.284188 178.653145 L447.284188 178.701229" class="reactive tooltip-trigger" /><rect x="430.6901709401709" y="178.70122938746226" height="14.5401001877417" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="447.284188034188" cy="194.44097715018506" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="447.284188034188" cy="178.65314520000175" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 0.7437
+Q1-1.5IQR: 0.7437
+Q1: 0.7517
+Median: 0.8074
+Q3: 0.8487
+Q3+1.5IQR: 0.8490
+Max: 0.8490</desc><desc class="x centered">447.284188034188</desc><desc class="y centered">185.98470080256084</desc><desc class="x_label" /></g></g></g><g class="series serie-12 color-12"><g class="boxes"><g class="box"><path stroke-width="3" d="M476.700855 94.290475 L493.294872 94.290475" class="reactive tooltip-trigger" /><path stroke-width="3" d="M468.403846 94.180004 L501.591880 94.180004" class="reactive tooltip-trigger" /><path stroke-width="3" d="M476.700855 94.037525 L493.294872 94.037525" class="reactive tooltip-trigger" /><path stroke-width="2" d="M484.997863 94.290475 L484.997863 94.238478" class="reactive tooltip-trigger" /><path stroke-width="2" d="M484.997863 94.037525 L484.997863 94.084470" class="reactive tooltip-trigger" /><rect x="468.40384615384613" y="94.08447018757306" height="0.15400743739064637" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="484.9978632478632" cy="94.29047534982237" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="484.9978632478632" cy="94.03752495014123" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.4114
+Q1-1.5IQR: 1.4114
+Q1: 1.4117
+Median: 1.4121
+Q3: 1.4128
+Q3+1.5IQR: 1.4131
+Max: 1.4131</desc><desc class="x centered">484.9978632478632</desc><desc class="y centered">94.16619041250763</desc><desc class="x_label" /></g></g></g><g class="series serie-13 color-13"><g class="boxes"><g class="box"><path stroke-width="3" d="M514.414530 94.269910 L531.008547 94.269910" class="reactive tooltip-trigger" /><path stroke-width="3" d="M506.117521 93.883179 L539.305556 93.883179" class="reactive tooltip-trigger" /><path stroke-width="3" d="M514.414530 92.124849 L531.008547 92.124849" class="reactive tooltip-trigger" /><path stroke-width="2" d="M522.711538 94.269910 L522.711538 94.107048" class="reactive tooltip-trigger" /><path stroke-width="2" d="M522.711538 92.124849 L522.711538 92.861429" class="reactive tooltip-trigger" /><rect x="506.1175213675213" y="92.86142936264787" height="1.2456188999294682" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="522.7115384615385" cy="94.26990989991828" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="522.7115384615385" cy="92.12484900004347" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.4115
+Q1-1.5IQR: 1.4115
+Q1: 1.4126
+Median: 1.4141
+Q3: 1.4209
+Q3+1.5IQR: 1.4258
+Max: 1.4258</desc><desc class="x centered">522.7115384615385</desc><desc class="y centered">93.44928307505688</desc><desc class="x_label" /></g></g></g><g class="series serie-14 color-14"><g class="boxes"><g class="box"><path stroke-width="3" d="M552.128205 93.470151 L568.722222 93.470151" class="reactive tooltip-trigger" /><path stroke-width="3" d="M543.831197 92.517076 L577.019231 92.517076" class="reactive tooltip-trigger" /><path stroke-width="3" d="M552.128205 69.111629 L568.722222 69.111629" class="reactive tooltip-trigger" /><path stroke-width="2" d="M560.425214 93.470151 L560.425214 93.060591" class="reactive tooltip-trigger" /><path stroke-width="2" d="M560.425214 69.111629 L560.425214 81.519423" class="reactive tooltip-trigger" /><rect x="543.8311965811965" y="81.51942318752936" height="11.54116811253516" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="560.4252136752136" cy="93.4701511501371" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="560.4252136752136" cy="69.1116290999671" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.4169
+Q1-1.5IQR: 1.4169
+Q1: 1.4196
+Median: 1.4232
+Q3: 1.4965
+Q3+1.5IQR: 1.5793
+Max: 1.5793</desc><desc class="x centered">560.4252136752136</desc><desc class="y centered">85.93577421753795</desc><desc class="x_label" /></g></g></g><g class="series serie-15 color-15"><g class="boxes"><g class="box"><path stroke-width="3" d="M589.841880 88.972623 L606.435897 88.972623" class="reactive tooltip-trigger" /><path stroke-width="3" d="M581.544872 66.030256 L614.732906 66.030256" class="reactive tooltip-trigger" /><path stroke-width="3" d="M589.841880 62.091945 L606.435897 62.091945" class="reactive tooltip-trigger" /><path stroke-width="2" d="M598.138889 88.972623 L598.138889 77.165166" class="reactive tooltip-trigger" /><path stroke-width="2" d="M598.138889 62.091945 L598.138889 62.111909" class="reactive tooltip-trigger" /><rect x="581.5448717948718" y="62.11190857498514" height="15.053257537442732" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="598.1388888888889" cy="88.97262284995668" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="598.1388888888889" cy="62.09194500002559" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.4468
+Q1-1.5IQR: 1.4468
+Q1: 1.5256
+Median: 1.5998
+Q3: 1.6259
+Q3+1.5IQR: 1.6261
+Max: 1.6261</desc><desc class="x centered">598.1388888888889</desc><desc class="y centered">71.27437968751198</desc><desc class="x_label" /></g></g></g><g class="series serie-16 color-16"><g class="boxes"><g class="box"><path stroke-width="3" d="M627.555556 76.962043 L644.149573 76.962043" class="reactive tooltip-trigger" /><path stroke-width="3" d="M619.258547 46.484652 L652.446581 46.484652" class="reactive tooltip-trigger" /><path stroke-width="3" d="M627.555556 7.582672 L644.149573 7.582672" class="reactive tooltip-trigger" /><path stroke-width="2" d="M635.852564 76.962043 L635.852564 76.200835" class="reactive tooltip-trigger" /><path stroke-width="2" d="M635.852564 7.582672 L635.852564 35.820689" class="reactive tooltip-trigger" /><rect x="619.258547008547" y="35.82068947499101" height="40.38014594991637" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="635.8525641025641" cy="76.9620434999124" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="635.8525641025641" cy="7.582672200220259" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.5269
+Q1-1.5IQR: 1.5269
+Q1: 1.5320
+Median: 1.7301
+Q3: 1.8012
+Q3+1.5IQR: 1.9894
+Max: 1.9894</desc><desc class="x centered">635.8525641025641</desc><desc class="y centered">48.610178459985946</desc><desc class="x_label" /></g></g></g><g class="series serie-17 color-17"><g class="boxes"><g class="box"><path stroke-width="3" d="M665.269231 94.275803 L681.863248 94.275803" class="reactive tooltip-trigger" /><path stroke-width="3" d="M656.972222 93.961078 L690.160256 93.961078" class="reactive tooltip-trigger" /><path stroke-width="3" d="M665.269231 92.000989 L681.863248 92.000989" class="reactive tooltip-trigger" /><path stroke-width="2" d="M673.566239 94.275803 L673.566239 94.236875" class="reactive tooltip-trigger" /><path stroke-width="2" d="M673.566239 92.000989 L673.566239 93.448917" class="reactive tooltip-trigger" /><rect x="656.9722222222222" y="93.44891700000608" height="0.7879579125074088" width="33.18803418803419" class="subtle-fill reactive tooltip-trigger" /><circle cx="673.5662393162393" cy="94.27580295001098" r="3" class="subtle-fill reactive tooltip-trigger" /><circle cx="673.5662393162393" cy="92.00098890010486" r="3" class="subtle-fill reactive tooltip-trigger" /><desc class="value">Min: 1.4115
+Q1-1.5IQR: 1.4115
+Q1: 1.4118
+Median: 1.4136
+Q3: 1.4170
+Q3+1.5IQR: 1.4267
+Max: 1.4267</desc><desc class="x centered">673.5662393162393</desc><desc class="y centered">93.58473239248818</desc><desc class="x_label" /></g></g></g></g><g class="titles"><text x="400.0" y="26" class="title plot_title">Speed in Seconds</text><text x="427.0" y="580.0" class="title">Trial</text><text x="0" y="228.0" class="title" transform="rotate(-90 0.000000 202.000000)">Duration</text></g><g transform="translate(74, 46)" class="plot overlay"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /><g class="series serie-3 color-3" /><g class="series serie-4 color-4" /><g class="series serie-5 color-5" /><g class="series serie-6 color-6" /><g class="series serie-7 color-7" /><g class="series serie-8 color-8" /><g class="series serie-9 color-9" /><g class="series serie-10 color-10" /><g class="series serie-11 color-11" /><g class="series serie-12 color-12" /><g class="series serie-13 color-13" /><g class="series serie-14 color-14" /><g class="series serie-15 color-15" /><g class="series serie-16 color-16" /><g class="series serie-17 color-17" /></g><g transform="translate(74, 46)" class="plot text-overlay"><g class="series serie-0 color-0" /><g class="series serie-1 color-1" /><g class="series serie-2 color-2" /><g class="series serie-3 color-3" /><g class="series serie-4 color-4" /><g class="series serie-5 color-5" /><g class="series serie-6 color-6" /><g class="series serie-7 color-7" /><g class="series serie-8 color-8" /><g class="series serie-9 color-9" /><g class="series serie-10 color-10" /><g class="series serie-11 color-11" /><g class="series serie-12 color-12" /><g class="series serie-13 color-13" /><g class="series serie-14 color-14" /><g class="series serie-15 color-15" /><g class="series serie-16 color-16" /><g class="series serie-17 color-17" /></g><g transform="translate(74, 46)" class="plot tooltip-overlay"><g transform="translate(0 0)" style="opacity: 0" class="tooltip"><rect rx="0" ry="0" width="0" height="0" class="tooltip-box" /><g class="text" /></g></g></g></svg>
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index 0e8b6c8..453c923 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,8 +4,8 @@ keywords = ["GIL"]
 requires-python = ">=3.7"
 
 [project.urls]
-homepage = "https://github.com/milesgranger/gil-knocker"
-repository = "https://github.com/milesgranger/gil-knocker"
+homepage = "https://github.com/milesgranger/gilknocker"
+repository = "https://github.com/milesgranger/gilknocker"
 
 [build-system]
 requires = ["maturin>=0.14,<0.15"]
diff --git a/src/lib.rs b/src/lib.rs
index ae4a4b7..fa0092b 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -52,26 +52,53 @@ pub struct KnockKnock {
     tx: Option<Sender<Message>>,
     rx: Option<Receiver<Ack>>,
     contention_metric: Arc<RwLock<f32>>,
-    interval: Duration,
+    polling_interval: Duration,
+    sampling_interval: Duration,
     timeout: Duration,
 }
 
 #[pymethods]
 impl KnockKnock {
-    /// Initialize with interval (microseconds), as the time between trying to acquire the GIL,
-    /// and timeout (seconds) as time to wait for monitoring thread to exit.
+    /// Initialize with ``polling_interval_micros``, as the time between trying to acquire the GIL,
+    /// ``sampling_interval_micros`` as the time between the polling routine, and ``timeout_secs``
+    /// as time to wait for monitoring thread to exit.
+    ///
+    /// A more frequent polling interval will give a more accurate reflection of actual GIL contention,
+    /// and a more frequent sampling interval will increase the 'real time' reflection of GIL contention.
+    /// Alternatively a less frequent sampling interval will come to reflect an average GIL contention of
+    /// the running program.
+    ///
+    /// polling_interval_micros: Optional[int]
+    ///     How frequently to ask to aquire the GIL, defaults to 1_000 microseconds (1ms)
+    /// sampling_interval_micros: Optional[int]
+    ///     How frequently and long to sample the GIL contention at polling interval,
+    ///     defaults to 10x polling_interval_micros.
+    /// timeout_secs: Optional[int]
+    ///     Timeout when attempting to stop or send messages to monitoring thread. Defaults to sum of polling
+    ///     and sampling intervals plus 1 second.
     #[new]
-    pub fn __new__(interval_micros: Option<u64>, timeout_secs: Option<u64>) -> PyResult<Self> {
-        let interval = Duration::from_micros(interval_micros.unwrap_or_else(|| 10));
-        let timeout = Duration::from_secs(timeout_secs.unwrap_or_else(|| 5));
-        if timeout <= interval {
-            return Err(PyValueError::new_err(format!(
-                "`interval` ({:?}) must be less than `timeout` ({:?})",
-                interval, timeout
-            )));
+    pub fn __new__(
+        polling_interval_micros: Option<u64>,
+        sampling_interval_micros: Option<u64>,
+        timeout_secs: Option<u64>,
+    ) -> PyResult<Self> {
+        let polling_interval =
+            Duration::from_micros(polling_interval_micros.unwrap_or_else(|| 1000));
+        let sampling_interval = Duration::from_micros(
+            sampling_interval_micros.unwrap_or_else(|| polling_interval.as_micros() as u64 * 10),
+        );
+
+        let timeout = Duration::from_secs(timeout_secs.unwrap_or_else(|| {
+            (polling_interval + sampling_interval + Duration::from_secs(1)).as_secs() as u64
+        }));
+        if timeout <= polling_interval + sampling_interval {
+            return Err(PyValueError::new_err(
+                "timeout must be greater than the sum of polling and sampling intervals",
+            ));
         }
         Ok(KnockKnock {
-            interval,
+            polling_interval,
+            sampling_interval,
             timeout,
             ..Default::default()
         })
@@ -127,39 +154,58 @@ impl KnockKnock {
         let contention_metric = Arc::new(const_rwlock(0_f32));
         self.contention_metric = contention_metric.clone();
 
-        let interval = self.interval;
+        let polling_interval = self.polling_interval;
+        let sampling_interval = self.sampling_interval;
+
         let handle = py.allow_threads(move || {
             thread::spawn(move || {
-                let mut time_to_acquire = Duration::from_millis(0);
-                let mut runtime = Instant::now();
-
-                let gil_check_thread = || {
-                    thread::spawn(|| {
-                        let start = Instant::now();
-                        Python::with_gil(move |_| start.elapsed())
+                let mut total_time_waiting = Duration::from_millis(0);
+                let mut total_time_sampling = Duration::from_millis(0);
+
+                let sample_gil = || {
+                    thread::spawn(move || {
+                        let time_sampling = Instant::now();
+                        let mut time_waiting = Duration::from_secs(0);
+
+                        // Begin polling gil for duration of sampling interval
+                        while time_sampling.elapsed() < sampling_interval {
+                            let start = Instant::now();
+                            time_waiting += Python::with_gil(move |_| start.elapsed());
+                            thread::sleep(polling_interval);
+                        }
+                        (time_waiting, time_sampling.elapsed())
                     })
                 };
-                let mut handle = gil_check_thread();
 
+                let mut handle = Some(sample_gil());
                 loop {
-                    match recv.recv_timeout(interval) {
+                    match recv.recv_timeout(sampling_interval) {
                         Ok(message) => match message {
                             Message::Stop => break,
                             Message::Reset => {
-                                time_to_acquire = Duration::from_millis(0);
-                                runtime = Instant::now();
+                                total_time_waiting = Duration::from_millis(0);
+                                total_time_sampling = Duration::from_millis(0);
                                 *(*contention_metric).write() = 0_f32;
                                 send.send(Ack).unwrap(); // notify reset done
                             }
                         },
                         Err(RecvTimeoutError::Disconnected) => break,
                         Err(RecvTimeoutError::Timeout) => {
-                            if handle.is_finished() {
-                                time_to_acquire += handle.join().unwrap();
+                            if handle
+                                .as_ref()
+                                .map(|hdl| hdl.is_finished())
+                                .unwrap_or_else(|| false)
+                            {
+                                let (time_waiting, time_sampling) =
+                                    take(&mut handle).unwrap().join().unwrap();
+                                total_time_sampling += time_sampling;
+                                total_time_waiting += time_waiting;
                                 let mut cm = (*contention_metric).write();
-                                *cm = time_to_acquire.as_micros() as f32
-                                    / runtime.elapsed().as_micros() as f32;
-                                handle = gil_check_thread();
+                                *cm = total_time_waiting.as_micros() as f32
+                                    / total_time_sampling.as_micros() as f32;
+                                debug_assert!(handle.is_none()); // handle reset when done
+                            } else if handle.is_none() {
+                                handle = Some(sample_gil());
                             }
                         }
                     }
@@ -169,30 +215,31 @@ impl KnockKnock {
         self.handle = Some(handle);
     }
 
+    /// Is the GIL knocker thread running?
+    #[getter]
+    pub fn is_running(&self) -> bool {
+        self.handle.is_some()
+    }
+
     /// Stop polling the GIL.
     pub fn stop(&mut self) -> PyResult<()> {
-        match take(&mut self.handle) {
-            Some(handle) => {
-                if let Some(send) = take(&mut self.tx) {
-                    send.send(Message::Stop)
-                        .map_err(|e| PyBrokenPipeError::new_err(e.to_string()))?;
-
-                    let start = Instant::now();
-                    while !handle.is_finished() {
-                        thread::sleep(Duration::from_millis(100));
-                        if start.elapsed() > self.timeout {
-                            return Err(PyTimeoutError::new_err("Failed to stop knocker thread."));
-                        }
+        if let Some(handle) = take(&mut self.handle) {
+            if let Some(send) = take(&mut self.tx) {
+                send.send(Message::Stop)
+                    .map_err(|e| PyBrokenPipeError::new_err(e.to_string()))?;
+
+                let start = Instant::now();
+                while !handle.is_finished() {
+                    if start.elapsed() > self.timeout {
+                        return Err(PyTimeoutError::new_err("Failed to stop knocker thread."));
                     }
+                    thread::sleep(Duration::from_millis(100));
                 }
-                handle
-                    .join()
-                    .map_err(|_| PyRuntimeError::new_err("Failed to join knocker thread."))?;
-                Ok(())
             }
-            None => Err(PyValueError::new_err(
-                "Appears `start` was not called, no handle.",
-            )),
+            handle
+                .join()
+                .map_err(|_| PyRuntimeError::new_err("Failed to join knocker thread."))?;
         }
+        Ok(())
     }
 }


Test patch:
diff --git a/benchmarks/test_bench.py b/benchmarks/test_bench.py
index b5f0af7..07a4a27 100644
--- a/benchmarks/test_bench.py
+++ b/benchmarks/test_bench.py
@@ -1,3 +1,5 @@
+import time
+import random
 import pytest
 import numpy as np
 import threading
@@ -17,8 +19,14 @@ def a_little_gil():
         x[:] = np.fft.fft2(x).real
 
 
+def some_gil():
+    for i in range(10_000):
+        time.sleep(random.random() / 100_000)
+        _ = b"1" * 2048**2
+
+
 @pytest.mark.parametrize("interval", (None, 10, 100, 1_000, 10_000, 100_000))
-@pytest.mark.parametrize("target", (a_lotta_gil, a_little_gil))
+@pytest.mark.parametrize("target", (a_lotta_gil, some_gil, a_little_gil))
 def test_bench(benchmark, interval: int, target):
     if interval:
         knocker = KnockKnock(interval)
diff --git a/tests/test_knockknock.py b/tests/test_knockknock.py
index 3d1b0b7..ca1a42d 100644
--- a/tests/test_knockknock.py
+++ b/tests/test_knockknock.py
@@ -1,12 +1,25 @@
+import random
 import pytest
 import numpy as np
 import threading
 import time
+from functools import wraps
 from gilknocker import KnockKnock
 
 
 N_THREADS = 4
-N_PTS = 4096
+N_PTS = 2048
+
+
+def flaky(f):
+    @wraps(f)
+    def wrapper(*args, **kwargs):
+        for _ in range(3):
+            try:
+                return f(*args, **kwargs)
+            except Exception:
+                continue
+        return f(*args, **kwargs)
 
 
 def a_lotta_gil():
@@ -17,13 +30,19 @@ def a_lotta_gil():
 
 def a_little_gil():
     """Work which releases the GIL"""
-    for i in range(2):
+    for i in range(10):
         x = np.random.randn(N_PTS, N_PTS)
         x[:] = np.fft.fft2(x).real
 
 
+def some_gil():
+    for i in range(10_000):
+        time.sleep(random.random() / 100_000)
+        _ = b"1" * 2048**2
+
+
 def _run(target):
-    knocker = KnockKnock(interval_micros=1000, timeout_secs=1)
+    knocker = KnockKnock(polling_interval_micros=1000, timeout_secs=1)
     knocker.start()
     threads = []
     for i in range(N_THREADS):
@@ -37,6 +56,7 @@ def _run(target):
     return knocker
 
 
+@flaky
 def test_knockknock_busy():
     knocker = _run(a_lotta_gil)
 
@@ -53,17 +73,29 @@ def test_knockknock_busy():
             prev_cm = knocker.contention_metric
 
         # ~0.15 oN mY MaChInE.
-        assert knocker.contention_metric < 0.3
+        assert knocker.contention_metric < 0.5
     finally:
         knocker.stop()
 
 
+@flaky
 def test_knockknock_available_gil():
     knocker = _run(a_little_gil)
 
     try:
-        # usually ~0.002
-        assert knocker.contention_metric < 0.06
+        # usually ~0.002, but can be up to ~0.15 on windows
+        assert knocker.contention_metric < 0.2
+    finally:
+        knocker.stop()
+
+
+@flaky
+def test_knockknock_some_gil():
+    knocker = _run(some_gil)
+
+    try:
+        # usually ~0.75ish, but ~0.4 on mac
+        assert 0.3 < knocker.contention_metric < 0.8
     finally:
         knocker.stop()