1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
## Dual `_select` without GVL:
Always release GVL:
```
Warming up --------------------------------------
KQueue 55.896k i/100ms
Select 17.023k i/100ms
Calculating -------------------------------------
KQueue 532.515k (± 8.0%) i/s - 2.683M in 5.071193s
Select 177.956k (± 3.4%) i/s - 902.219k in 5.075817s
Comparison:
KQueue: 532515.3 i/s
Select: 177956.1 i/s - 2.99x (± 0.00) slower
```
Only release GVL with non-zero timeout, with selector.elect(1) (so always hitting slow path):
```
Warming up --------------------------------------
KQueue 39.628k i/100ms
Select 18.330k i/100ms
Calculating -------------------------------------
KQueue 381.868k (± 6.5%) i/s - 1.902M in 5.004267s
Select 171.623k (± 3.0%) i/s - 861.510k in 5.024308s
Comparison:
KQueue: 381867.8 i/s
Select: 171622.5 i/s - 2.23x (± 0.00) slower
```
Only release GVL with non-zero timeout, with selector.select(0) so always hitting fast path:
```
Warming up --------------------------------------
KQueue 56.240k i/100ms
Select 17.888k i/100ms
Calculating -------------------------------------
KQueue 543.042k (± 7.8%) i/s - 2.700M in 5.003790s
Select 171.866k (± 4.3%) i/s - 858.624k in 5.005785s
Comparison:
KQueue: 543041.5 i/s
Select: 171866.2 i/s - 3.16x (± 0.00) slower
```
Only release GVL when no events are ready and non-zero timeout, with selector.select(1):
```
Warming up --------------------------------------
KQueue 53.401k i/100ms
Select 16.691k i/100ms
Calculating -------------------------------------
KQueue 524.564k (± 6.1%) i/s - 2.617M in 5.006996s
Select 179.329k (± 2.4%) i/s - 901.314k in 5.029136s
Comparison:
KQueue: 524564.0 i/s
Select: 179329.1 i/s - 2.93x (± 0.00) slower
```
So this approach seems to be a net win of about 1.5x throughput.
|