|
4 | 4 |
|
5 | 5 | The following benchmarks are a comparison of `SyncMap` vs `Collections#synchronizedMap()` vs `ConcurrentHashMap`. |
6 | 6 |
|
| 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 | + |
7 | 37 | ```txt |
8 | 38 | 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 |
12 | 42 |
|
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 |
16 | 46 |
|
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 |
20 | 50 |
|
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 |
24 | 54 |
|
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 |
28 | 58 |
|
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 |
32 | 62 |
|
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 |
36 | 66 |
|
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 |
40 | 70 |
|
41 | 71 | 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 |
44 | 74 |
|
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 |
48 | 78 |
|
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 |
52 | 82 |
|
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 |
56 | 86 | ``` |
0 commit comments