DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
| Code Block | ||||||
|---|---|---|---|---|---|---|
| ||||||
public class RecordHeader implements Header {
private ByteBuffer keyBuffer;
private String key;
private ByteBuffer valueBuffer;
private byte[] value;
...
public synchronized String key() {
if (key == null) {
key = Utils.utf8(keyBuffer, keyBuffer.remaining());
keyBuffer = null;
}
return key;
}
public synchronized byte[] value() {
if (value == null && valueBuffer != null) {
value = Utils.toArray(valueBuffer);
valueBuffer = null;
}
return value;
}
}
|
After
| Code Block | ||||||
|---|---|---|---|---|---|---|
| ||||||
public class RecordHeader implements Header {
private ByteBuffer keyBuffer;
private volatile String key;
private ByteBuffer valueBuffer;
private volatile byte[] value;
public String key() {
if (key == null) {
synchronized (this) {
if (key == null) {
key = Utils.utf8(keyBuffer, keyBuffer.remaining());
keyBuffer = null;
}
}
}
return key;
}
public byte[] value() {
if (value == null && valueBuffer != null) {
synchronized (this) {
if (value == null && valueBuffer != null) {
value = Utils.toArray(valueBuffer);
valueBuffer = null;
}
}
}
return value;
}
} |
...
| Code Block | ||||||||
|---|---|---|---|---|---|---|---|---|
| ||||||||
@State(Scope.Benchmark)
@Fork(value = 1)
@Warmup(iterations = 5)
@Measurement(iterations = 15)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class RecordHeaderBenchmark {
private RecordHeader header;
@Setup(Level.Iteration)
public void setup() {
byte[] valueBytes = new byte[1000];
ByteBuffer keyBuffer = ByteBuffer.wrap("key".getBytes());
ByteBuffer valueBuffer = ByteBuffer.wrap(valueBytes);
header = new RecordHeader(keyBuffer, valueBuffer);
}
@Benchmark
@Threads(8)
public String benchmarkKey() {
return header.key();
}
@Benchmark
@Threads(8)
public byte[] benchmarkValue() {
return header.value();
}
} |
...