Set of concurrent wrappers around fastutil primitive maps.
Main purpose is to provide useful concurrent builders around fastutil primitive maps with flexible locking policy.
Advantages over java.util wrappers:
- builders provide maps with buckets,
- every map uses
striped ReadWriteLocksinstead ofsynchronized(mutex); one RW-lock per map's bucket, - two lock modes:
standardandbusy-waiting(could be good for low-latency systems), - no extra memory on stack -- API based on
primitive types.
Check usage section for more details.
Note: currently the lib contains wrappers not for every primitive map. Feel free to contribute.
<dependency>
<groupId>com.trivago</groupId>
<artifactId>fastutil-concurrent-wrapper</artifactId>
<version>0.2.3</version>
</dependency>implementation group: 'com.trivago', name: 'fastutil-concurrent-wrapper', version: '0.2.3'number of buckets-- number of buckets in the map (default8),default value-- default value, for getOrDefault() methodinitial capacity-- initial map capacity (default100_000),concurrent mode-- lock mode: default and busy-waiting,load factor-- map load factor (default0.8f).
ConcurrentLongLongMapBuilder b = ConcurrentLongLongMapBuilder.newBuilder()
.withBuckets(2)
.withDefaultValue(0)
.withInitialCapacity(100)
.withMode(ConcurrentLongLongMapBuilder.MapMode.BUSY_WAITING)
.withLoadFactor(0.9f);
LongLongMap map = b.build();
map.put(1L, 10L);
long v = map.get(1L);Examples of creation and usage could be found inside test directory;
Currently, we offer two locking modes:
blocking(default),busy-waiting.
For running JMH tests just execute:
./gradlew jmhResults for FastutilWrapper BusyWaiting mode vs FastutilWrapper Default mode vs java.util wrappers
Throughput (more is better)
Benchmark Mode Cnt Score Error Units
FastutilWrapperBusyWaitingBenchmark.testRandomAllOpsThroughput thrpt 15 14517457,055 ? 795637,784 ops/s
FastutilWrapperBusyWaitingBenchmark.testRandomGetThroughput thrpt 15 16610181,320 ? 1456776,589 ops/s
FastutilWrapperBusyWaitingBenchmark.testRandomPutThroughput thrpt 13 11706178,916 ? 2547333,524 ops/s
FastutilWrapperDefaultBenchmark.testRandomAllOpsThroughput thrpt 15 7385357,514 ? 1127356,032 ops/s
FastutilWrapperDefaultBenchmark.testRandomGetThroughput thrpt 15 16190621,923 ? 1836415,022 ops/s
FastutilWrapperDefaultBenchmark.testRandomPutThroughput thrpt 15 8945369,395 ? 1225460,217 ops/s
JavaUtilWrapperBenchmark.testRandomAllOpsThroughput thrpt 15 4921201,916 ? 410471,239 ops/s
JavaUtilWrapperBenchmark.testRandomGetThroughput thrpt 15 7827123,690 ? 557193,670 ops/s
JavaUtilWrapperBenchmark.testRandomPutThroughput thrpt 15 4832517,371 ? 1122344,647 ops/sAverageTime per ops (less is better)
Benchmark Mode Cnt Score Error Units
FastutilWrapperBusyWaitingBenchmark.testRandomAllOpsAvgTime avgt 15 268,790 ? 22,526 ns/op
FastutilWrapperBusyWaitingBenchmark.testRandomGetAvgTime avgt 15 231,552 ? 16,116 ns/op
FastutilWrapperBusyWaitingBenchmark.testRandomPutAvgTime avgt 10 292,246 ? 49,757 ns/op
FastutilWrapperDefaultBenchmark.testRandomAllOpsAvgTime avgt 15 467,381 ? 9,790 ns/op
FastutilWrapperDefaultBenchmark.testRandomGetAvgTime avgt 15 237,683 ? 14,167 ns/op
FastutilWrapperDefaultBenchmark.testRandomPutAvgTime avgt 15 427,441 ? 25,116 ns/op
JavaUtilWrapperBenchmark.testRandomAllOpsAvgTime avgt 15 781,869 ? 191,081 ns/op
JavaUtilWrapperBenchmark.testRandomGetAvgTime avgt 15 470,869 ? 33,198 ns/op
JavaUtilWrapperBenchmark.testRandomPutAvgTime avgt 15 964,613 ? 422,648 ns/opThe machine
MacBook Pro (15-inch, 2019)
Processor 2,6 GHz 6-Core Intel Core i7
Memory 16 GB 2400 MHz DDR4A-Z surname order