Skip to content

Commit 0547d75

Browse files
Merge pull request #13 from aaronriekenberg/020623_jmh
JMH Benchmarks: Avoid byte array copy for reads in NMA valueSerializer
2 parents bc29045 + f50fa09 commit 0547d75

File tree

5 files changed

+30
-26
lines changed

5 files changed

+30
-26
lines changed

benchmarks/build.gradle.kts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@ dependencies {
1616
}
1717

1818
jmh {
19-
warmupIterations.set(3)
20-
iterations.set(3)
19+
warmupIterations.set(5)
20+
iterations.set(5)
2121
fork.set(1)
2222
forceGC.set(true)
2323
failOnError.set(true)
24-
jvmArgs.set(listOf("-Xmx2G"))
24+
jvmArgs.set(listOf("-Xmx4G"))
2525
}

benchmarks/src/jmh/kotlin/com/target/nativememoryallocator/benchmarks/OffHeapGetPutBenchmark.kt

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import com.target.nativememoryallocator.benchmarks.impl.RocksDBOffHeapCache
55
import com.target.nativememoryallocator.benchmarks.impl.UnimplementedOffHeapCache
66
import mu.KotlinLogging
77
import org.openjdk.jmh.annotations.*
8+
import java.nio.ByteBuffer
89

910
private val logger = KotlinLogging.logger {}
1011

@@ -26,7 +27,7 @@ open class OffHeapGetPutBenchmark {
2627
)
2728
var cacheType: String = ""
2829

29-
private var cache: OffHeapCache<String, ByteArray> = UnimplementedOffHeapCache
30+
private var cache: OffHeapCache<String, ByteBuffer> = UnimplementedOffHeapCache
3031

3132
@State(Scope.Thread)
3233
open class ThreadState {
@@ -60,7 +61,7 @@ open class OffHeapGetPutBenchmark {
6061
}
6162

6263
for (i in 0 until NUM_ENTRIES) {
63-
cache.put(key = i.toString(), value = ByteArray(VALUE_SIZE))
64+
cache.put(key = i.toString(), value = ByteBuffer.wrap(ByteArray(VALUE_SIZE)))
6465
}
6566

6667
cache.logMetadata()
@@ -78,7 +79,7 @@ open class OffHeapGetPutBenchmark {
7879
@Benchmark
7980
@Group("read_only")
8081
@GroupThreads(8)
81-
fun readOnly(threadState: ThreadState): ByteArray? {
82+
fun readOnly(threadState: ThreadState): ByteBuffer? {
8283
val key = threadState.nextIndex().toString()
8384
val value = cache.get(key = key)
8485
if (value == null) {
@@ -92,13 +93,13 @@ open class OffHeapGetPutBenchmark {
9293
@GroupThreads(8)
9394
fun writeOnly(threadState: ThreadState) {
9495
val key = threadState.nextIndex().toString()
95-
cache.put(key = key, value = ByteArray(VALUE_SIZE))
96+
cache.put(key = key, value = ByteBuffer.wrap(ByteArray(VALUE_SIZE)))
9697
}
9798

9899
@Benchmark
99100
@Group("readwrite")
100101
@GroupThreads(6)
101-
fun readwrite_get(threadState: ThreadState): ByteArray? {
102+
fun readwrite_get(threadState: ThreadState): ByteBuffer? {
102103
val key = threadState.nextIndex().toString()
103104
val value = cache.get(key = key)
104105
if (value == null) {
@@ -112,7 +113,7 @@ open class OffHeapGetPutBenchmark {
112113
@GroupThreads(2)
113114
fun readwrite_put(threadState: ThreadState) {
114115
val key = threadState.nextIndex().toString()
115-
cache.put(key = key, value = ByteArray(VALUE_SIZE))
116+
cache.put(key = key, value = ByteBuffer.wrap(ByteArray(VALUE_SIZE)))
116117
}
117118

118119
}

benchmarks/src/jmh/kotlin/com/target/nativememoryallocator/benchmarks/impl/NMAOffHeapCache.kt

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,15 @@ import com.target.nativememoryallocator.map.NativeMemoryMapBackend
77
import com.target.nativememoryallocator.map.NativeMemoryMapBuilder
88
import com.target.nativememoryallocator.map.NativeMemoryMapSerializer
99
import mu.KotlinLogging
10+
import java.nio.ByteBuffer
1011

1112
private val logger = KotlinLogging.logger {}
1213

1314

1415
/**
1516
* NMA implementation of OffHeapCache.
1617
*/
17-
class NMAOffHeapCache : OffHeapCache<String, ByteArray> {
18+
class NMAOffHeapCache : OffHeapCache<String, ByteBuffer> {
1819

1920
init {
2021
logger.info { "initializing NMAOffHeapCache" }
@@ -25,27 +26,27 @@ class NMAOffHeapCache : OffHeapCache<String, ByteArray> {
2526
nativeMemorySizeBytes = (10L * 1024 * 1024 * 1024), //10gb,
2627
).build()
2728

28-
private val valueSerializer = object : NativeMemoryMapSerializer<ByteArray> {
29-
override fun deserializeFromOnHeapMemoryBuffer(onHeapMemoryBuffer: OnHeapMemoryBuffer): ByteArray {
30-
return onHeapMemoryBuffer.toTrimmedArray()
29+
private val valueSerializer = object : NativeMemoryMapSerializer<ByteBuffer> {
30+
override fun deserializeFromOnHeapMemoryBuffer(onHeapMemoryBuffer: OnHeapMemoryBuffer): ByteBuffer {
31+
return onHeapMemoryBuffer.asByteBuffer()
3132
}
3233

33-
override fun serializeToByteArray(value: ByteArray): ByteArray {
34-
return value
34+
override fun serializeToByteArray(value: ByteBuffer): ByteArray {
35+
return value.array()
3536
}
3637
};
3738

38-
private val nativeMemoryMap = NativeMemoryMapBuilder<String, ByteArray>(
39+
private val nativeMemoryMap = NativeMemoryMapBuilder<String, ByteBuffer>(
3940
valueSerializer = valueSerializer,
4041
nativeMemoryAllocator = nativeMemoryAllocator,
4142
backend = NativeMemoryMapBackend.CAFFEINE,
4243
).build()
4344

44-
override fun get(key: String): ByteArray? {
45+
override fun get(key: String): ByteBuffer? {
4546
return nativeMemoryMap.get(key = key)
4647
}
4748

48-
override fun put(key: String, value: ByteArray) {
49+
override fun put(key: String, value: ByteBuffer) {
4950
nativeMemoryMap.put(key = key, value = value)
5051
}
5152

benchmarks/src/jmh/kotlin/com/target/nativememoryallocator/benchmarks/impl/RocksDBOffHeapCache.kt

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import com.target.nativememoryallocator.benchmarks.OffHeapCache
44
import mu.KotlinLogging
55
import org.rocksdb.RocksDB
66
import java.io.File
7+
import java.nio.ByteBuffer
78

89
private val logger = KotlinLogging.logger {}
910

1011
/**
1112
* RocksDB implementation of OffHeapCache.
1213
*/
13-
class RocksDBOffHeapCache : OffHeapCache<String, ByteArray> {
14+
class RocksDBOffHeapCache : OffHeapCache<String, ByteBuffer> {
1415

1516
private val rocksDbDir: String
1617

@@ -28,12 +29,12 @@ class RocksDBOffHeapCache : OffHeapCache<String, ByteArray> {
2829
rocksDB = RocksDB.open(rocksDbDir)
2930
}
3031

31-
override fun get(key: String): ByteArray? {
32-
return rocksDB.get(key.toByteArray())
32+
override fun get(key: String): ByteBuffer? {
33+
return rocksDB.get(key.toByteArray())?.let { ByteBuffer.wrap(it) }
3334
}
3435

35-
override fun put(key: String, value: ByteArray) {
36-
rocksDB.put(key.toByteArray(), value)
36+
override fun put(key: String, value: ByteBuffer) {
37+
rocksDB.put(key.toByteArray(), value.array())
3738
}
3839

3940
override fun size(): Int {

benchmarks/src/jmh/kotlin/com/target/nativememoryallocator/benchmarks/impl/UnimplementedOffHeapCache.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,19 @@
11
package com.target.nativememoryallocator.benchmarks.impl
22

33
import com.target.nativememoryallocator.benchmarks.OffHeapCache
4+
import java.nio.ByteBuffer
45

56
/**
67
* Unimplemented OffHeapCache.
78
* All methods throw NotImplementedError.
89
*/
9-
object UnimplementedOffHeapCache : OffHeapCache<String, ByteArray> {
10+
object UnimplementedOffHeapCache : OffHeapCache<String, ByteBuffer> {
1011

11-
override fun get(key: String): ByteArray? {
12+
override fun get(key: String): ByteBuffer? {
1213
throw NotImplementedError()
1314
}
1415

15-
override fun put(key: String, value: ByteArray) {
16+
override fun put(key: String, value: ByteBuffer) {
1617
throw NotImplementedError()
1718
}
1819

0 commit comments

Comments
 (0)