Skip to content

Commit 13a167e

Browse files
improve(syncmap): clean up logic for the stamp lock
1 parent 465e710 commit 13a167e

File tree

3 files changed

+312
-274
lines changed

3 files changed

+312
-274
lines changed

collections/benchmarks.md

Lines changed: 65 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,83 @@
44

55
The following benchmarks are a comparison of `SyncMap` vs `Collections#synchronizedMap()` vs `ConcurrentHashMap`.
66

7+
### Summary
8+
9+
The `SyncMap` has similar performance characteristics of the `ConcurrentHashMap`,
10+
with an advantage in write speed.
11+
12+
The following results were recorded on an _M4 Macbook Pro_, using 8 threads and
13+
100,000 entries for each benchmark:
14+
15+
- `SyncMap` **get()** speed is...
16+
- 4.1% **SLOWER** than `ConcurrentHashMap` for an empty map.
17+
- 3.9% **SLOWER** than `ConcurrentHashMap` for a presized empty map.
18+
- 6.7% **SLOWER** than `ConcurrentHashMap` for a full map.
19+
20+
- `SyncMap` **put()** speed is...
21+
- 44.8% **FASTER** than `ConcurrentHashMap` for an empty map.
22+
- 30.0% **SLOWER** than `ConcurrentHashMap` for a presized empty map.
23+
- 53.9% **FASTER** than `ConcurrentHashMap` for a full map.
24+
25+
- `SyncMap` **put()** then **get()** speed is...
26+
- 135.6% **FASTER** than `ConcurrentHashMap` for an empty map.
27+
- 66.1% **FASTER** than `ConcurrentHashMap` for a presized empty map.
28+
- 86.0% **FASTER** than `ConcurrentHashMap` for a full map.
29+
30+
- `SyncMap` random **put()** and **get()** speed is...
31+
- 39.1% **FASTER** than `ConcurrentHashMap` for an empty map.
32+
- 38.1% **FASTER** than `ConcurrentHashMap` for a presized empty map.
33+
- 37.0% **FASTER** than `ConcurrentHashMap` for a full map.
34+
35+
### Results
36+
737
```txt
838
Benchmark (implementation) (mode) Mode Cnt Score Error Units
9-
SyncMapBenchmark.getOnly ConcurrentHashMap none thrpt 5 2.950 ± 0.024 ops/ns
10-
SyncMapBenchmark.getOnly ConcurrentHashMap presize thrpt 5 2.949 ± 0.003 ops/ns
11-
SyncMapBenchmark.getOnly ConcurrentHashMap prepopulate thrpt 5 2.664 ± 0.033 ops/ns
39+
SyncMapBenchmark.getOnly ConcurrentHashMap none thrpt 5 2.954 ± 0.016 ops/ns
40+
SyncMapBenchmark.getOnly ConcurrentHashMap presize thrpt 5 2.936 ± 0.005 ops/ns
41+
SyncMapBenchmark.getOnly ConcurrentHashMap prepopulate thrpt 5 2.658 ± 0.011 ops/ns
1242
13-
SyncMapBenchmark.getOnly SyncMap none thrpt 5 2.840 ± 0.016 ops/ns
14-
SyncMapBenchmark.getOnly SyncMap presize thrpt 5 2.827 ± 0.004 ops/ns
15-
SyncMapBenchmark.getOnly SyncMap prepopulate thrpt 5 2.481 ± 0.041 ops/ns
43+
SyncMapBenchmark.getOnly SyncMap none thrpt 5 2.833 ± 0.018 ops/ns
44+
SyncMapBenchmark.getOnly SyncMap presize thrpt 5 2.821 ± 0.004 ops/ns
45+
SyncMapBenchmark.getOnly SyncMap prepopulate thrpt 5 2.479 ± 0.021 ops/ns
1646
17-
SyncMapBenchmark.getOnly SynchronizedMap none thrpt 5 0.027 ± 0.003 ops/ns
18-
SyncMapBenchmark.getOnly SynchronizedMap presize thrpt 5 0.028 ± 0.001 ops/ns
19-
SyncMapBenchmark.getOnly SynchronizedMap prepopulate thrpt 5 0.034 ± 0.049 ops/ns
47+
SyncMapBenchmark.getOnly SynchronizedMap none thrpt 5 0.033 ± 0.045 ops/ns
48+
SyncMapBenchmark.getOnly SynchronizedMap presize thrpt 5 0.027 ± 0.004 ops/ns
49+
SyncMapBenchmark.getOnly SynchronizedMap prepopulate thrpt 5 0.035 ± 0.045 ops/ns
2050
21-
SyncMapBenchmark.putAndGet SyncMap none thrpt 5 0.426 ± 0.029 ops/ns
22-
SyncMapBenchmark.putAndGet SyncMap presize thrpt 5 0.440 ± 0.075 ops/ns
23-
SyncMapBenchmark.putAndGet SyncMap prepopulate thrpt 5 0.428 ± 0.077 ops/ns
51+
SyncMapBenchmark.putAndGet SyncMap none thrpt 5 0.391 ± 0.066 ops/ns
52+
SyncMapBenchmark.putAndGet SyncMap presize thrpt 5 0.427 ± 0.039 ops/ns
53+
SyncMapBenchmark.putAndGet SyncMap prepopulate thrpt 5 0.424 ± 0.020 ops/ns
2454
25-
SyncMapBenchmark.putAndGet ConcurrentHashMap none thrpt 5 0.156 ± 0.006 ops/ns
26-
SyncMapBenchmark.putAndGet ConcurrentHashMap presize thrpt 5 0.231 ± 0.058 ops/ns
27-
SyncMapBenchmark.putAndGet ConcurrentHashMap prepopulate thrpt 5 0.239 ± 0.021 ops/ns
55+
SyncMapBenchmark.putAndGet ConcurrentHashMap none thrpt 5 0.166 ± 0.113 ops/ns
56+
SyncMapBenchmark.putAndGet ConcurrentHashMap presize thrpt 5 0.257 ± 0.030 ops/ns
57+
SyncMapBenchmark.putAndGet ConcurrentHashMap prepopulate thrpt 5 0.228 ± 0.064 ops/ns
2858
29-
SyncMapBenchmark.putAndGet SynchronizedMap none thrpt 5 0.013 ± 0.008 ops/ns
30-
SyncMapBenchmark.putAndGet SynchronizedMap presize thrpt 5 0.012 ± 0.002 ops/ns
31-
SyncMapBenchmark.putAndGet SynchronizedMap prepopulate thrpt 5 0.012 ± 0.003 ops/ns
59+
SyncMapBenchmark.putAndGet SynchronizedMap none thrpt 5 0.012 ± 0.002 ops/ns
60+
SyncMapBenchmark.putAndGet SynchronizedMap presize thrpt 5 0.012 ± 0.003 ops/ns
61+
SyncMapBenchmark.putAndGet SynchronizedMap prepopulate thrpt 5 0.012 ± 0.007 ops/ns
3262
33-
SyncMapBenchmark.putOnly SyncMap none thrpt 5 0.202 ± 0.027 ops/ns
34-
SyncMapBenchmark.putOnly SyncMap presize thrpt 5 0.249 ± 0.047 ops/ns
35-
SyncMapBenchmark.putOnly SyncMap prepopulate thrpt 5 0.437 ± 0.014 ops/ns
63+
SyncMapBenchmark.putOnly SyncMap none thrpt 5 0.239 ± 0.025 ops/ns
64+
SyncMapBenchmark.putOnly SyncMap presize thrpt 5 0.235 ± 0.044 ops/ns
65+
SyncMapBenchmark.putOnly SyncMap prepopulate thrpt 5 0.457 ± 0.026 ops/ns
3666
37-
SyncMapBenchmark.putOnly ConcurrentHashMap none thrpt 5 0.164 ± 0.003 ops/ns
38-
SyncMapBenchmark.putOnly ConcurrentHashMap presize thrpt 5 0.324 ± 0.040 ops/ns
39-
SyncMapBenchmark.putOnly ConcurrentHashMap prepopulate thrpt 5 0.264 ± 0.029 ops/ns
67+
SyncMapBenchmark.putOnly ConcurrentHashMap none thrpt 5 0.165 ± 0.008 ops/ns
68+
SyncMapBenchmark.putOnly ConcurrentHashMap presize thrpt 5 0.336 ± 0.010 ops/ns
69+
SyncMapBenchmark.putOnly ConcurrentHashMap prepopulate thrpt 5 0.297 ± 0.043 ops/ns
4070
4171
SyncMapBenchmark.putOnly SynchronizedMap none thrpt 5 0.023 ± 0.004 ops/ns
42-
SyncMapBenchmark.putOnly SynchronizedMap presize thrpt 5 0.026 ± 0.027 ops/ns
43-
SyncMapBenchmark.putOnly SynchronizedMap prepopulate thrpt 5 0.027 ± 0.029 ops/ns
72+
SyncMapBenchmark.putOnly SynchronizedMap presize thrpt 5 0.023 ± 0.005 ops/ns
73+
SyncMapBenchmark.putOnly SynchronizedMap prepopulate thrpt 5 0.022 ± 0.003 ops/ns
4474
45-
SyncMapBenchmark.randomPutAndGet SyncMap none thrpt 5 0.193 ± 0.002 ops/ns
46-
SyncMapBenchmark.randomPutAndGet SyncMap presize thrpt 5 0.205 ± 0.010 ops/ns
47-
SyncMapBenchmark.randomPutAndGet SyncMap prepopulate thrpt 5 0.202 ± 0.001 ops/ns
75+
SyncMapBenchmark.randomPutAndGet SyncMap none thrpt 5 0.192 ± 0.009 ops/ns
76+
SyncMapBenchmark.randomPutAndGet SyncMap presize thrpt 5 0.203 ± 0.007 ops/ns
77+
SyncMapBenchmark.randomPutAndGet SyncMap prepopulate thrpt 5 0.200 ± 0.002 ops/ns
4878
49-
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap none thrpt 5 0.138 ± 0.003 ops/ns
50-
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap presize thrpt 5 0.146 ± 0.003 ops/ns
51-
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap prepopulate thrpt 5 0.145 ± 0.002 ops/ns
79+
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap none thrpt 5 0.138 ± 0.002 ops/ns
80+
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap presize thrpt 5 0.147 ± 0.001 ops/ns
81+
SyncMapBenchmark.randomPutAndGet ConcurrentHashMap prepopulate thrpt 5 0.146 ± 0.003 ops/ns
5282
53-
SyncMapBenchmark.randomPutAndGet SynchronizedMap none thrpt 5 0.018 ± 0.003 ops/ns
54-
SyncMapBenchmark.randomPutAndGet SynchronizedMap presize thrpt 5 0.019 ± 0.009 ops/ns
55-
SyncMapBenchmark.randomPutAndGet SynchronizedMap prepopulate thrpt 5 0.017 ± 0.012 ops/ns
83+
SyncMapBenchmark.randomPutAndGet SynchronizedMap none thrpt 5 0.017 ± 0.009 ops/ns
84+
SyncMapBenchmark.randomPutAndGet SynchronizedMap presize thrpt 5 0.016 ± 0.013 ops/ns
85+
SyncMapBenchmark.randomPutAndGet SynchronizedMap prepopulate thrpt 5 0.018 ± 0.004 ops/ns
5686
```

collections/readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ dependencies {
4646

4747
## Performance
4848

49-
The benchmarks below were recorded on a _M4 Mac Pro_.
49+
The benchmarks below were recorded on a _M4 Macbook Pro_.
5050

5151
- [SyncMap Benchmarks](benchmarks.md#syncmap)
5252

0 commit comments

Comments
 (0)