You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2021/04/30 14:07:20 UTC
[cassandra] branch trunk updated: Add a microbenchmark for checksums
This is an automated email from the ASF dual-hosted git repository.
brandonwilliams pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 438a9c8 Add a microbenchmark for checksums
438a9c8 is described below
commit 438a9c835abefac18dea8b6fbb422d75ac1b2b15
Author: Aleksei Zotov <az...@gmail.com>
AuthorDate: Mon Apr 5 00:24:25 2021 +0400
Add a microbenchmark for checksums
Patch by Alexey Zotov; reviewed by brandonwilliams for CASSANDRA-16360
---
build.xml | 2 +-
.../cassandra/test/microbench/AutoBoxingBench.java | 2 +-
.../test/microbench/BatchStatementBench.java | 2 +-
.../cassandra/test/microbench/ChecksumBench.java | 130 +++++++++++++++++++++
.../test/microbench/DirectorySizerBench.java | 2 +-
.../test/microbench/FastThreadLocalBench.java | 2 +-
.../cassandra/test/microbench/HashingBench.java | 2 +-
.../test/microbench/LatencyTrackingBench.java | 2 +-
.../cassandra/test/microbench/MessageOutBench.java | 2 +-
.../test/microbench/OutputStreamBench.java | 2 +-
.../test/microbench/PendingRangesBench.java | 2 +-
.../microbench/PreaggregatedByteBufsBench.java | 2 +-
.../apache/cassandra/test/microbench/Sample.java | 2 +-
.../test/microbench/StringsEncodeBench.java | 2 +-
14 files changed, 143 insertions(+), 13 deletions(-)
diff --git a/build.xml b/build.xml
index 0a40b2f..0e5291b 100644
--- a/build.xml
+++ b/build.xml
@@ -1220,7 +1220,7 @@
<include name="jopt*.jar"/>
<include name="commons*.jar"/>
</zipgroupfileset>
- <zipgroupfileset dir="{build.lib}" includes="*.jar"/>
+ <zipgroupfileset dir="${build.lib}" includes="*.jar"/>
</jar>
<jar jarfile="${build.test.dir}/benchmarks.jar">
<manifest>
diff --git a/test/microbench/org/apache/cassandra/test/microbench/AutoBoxingBench.java b/test/microbench/org/apache/cassandra/test/microbench/AutoBoxingBench.java
index fd6df39..9f0361d 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/AutoBoxingBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/AutoBoxingBench.java
@@ -38,7 +38,7 @@ import org.openjdk.jmh.annotations.Warmup;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 6, time = 20)
-@Fork(value = 1,jvmArgsAppend = { "-Xmx256M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
+@Fork(value = 1, jvmArgsAppend = { "-Xmx256M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
@Threads(4) // make sure this matches the number of _physical_cores_
@State(Scope.Benchmark)
public class AutoBoxingBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java b/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
index 8638006..b79f154 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
@@ -69,7 +69,7 @@ import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 1, jvmArgsAppend = "-Xmx512M")
@Threads(1)
@State(Scope.Benchmark)
public class BatchStatementBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/ChecksumBench.java b/test/microbench/org/apache/cassandra/test/microbench/ChecksumBench.java
new file mode 100644
index 0000000..5615f8c
--- /dev/null
+++ b/test/microbench/org/apache/cassandra/test/microbench/ChecksumBench.java
@@ -0,0 +1,130 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.test.microbench;
+
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+import com.google.common.primitives.Longs;
+import org.apache.cassandra.utils.ChecksumType;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.xerial.snappy.PureJavaCrc32C;
+
+import java.security.NoSuchAlgorithmException;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
+@Threads(4) // make sure this matches the number of _physical_cores_
+@State(Scope.Benchmark)
+public class ChecksumBench
+{
+ private static final Random random = new Random(12345678);
+
+ // intentionally not on power-of-2 values
+ @Param({ "31", "131", "517", "2041" })
+ private int bufferSize;
+
+ private byte[] array;
+
+ @Setup
+ public void setup() throws NoSuchAlgorithmException
+ {
+ array = new byte[bufferSize];
+ random.nextBytes(array);
+ }
+
+ @Benchmark
+ @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+ "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+ })
+ public byte[] benchCrc32()
+ {
+ return Longs.toByteArray(ChecksumType.CRC32.of(array, 0, array.length));
+ }
+
+ @Benchmark
+ @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+ "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+ "-XX:+UnlockDiagnosticVMOptions", "-XX:-UseCRC32Intrinsics",
+ })
+ public byte[] benchCrc32NoIntrinsic()
+ {
+ return Longs.toByteArray(ChecksumType.CRC32.of(array, 0, array.length));
+ }
+
+ @Benchmark
+ @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+ "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+ })
+ public byte[] benchHasherCrc32c()
+ {
+ Hasher crc32cHasher = Hashing.crc32c().newHasher();
+ crc32cHasher.putBytes(array);
+ return crc32cHasher.hash().asBytes();
+ }
+
+ @Benchmark
+ @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+ "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+ })
+ public byte[] benchPureJavaCrc32c()
+ {
+ PureJavaCrc32C pureJavaCrc32C = new PureJavaCrc32C();
+ pureJavaCrc32C.update(array, 0, array.length);
+ return Longs.toByteArray(pureJavaCrc32C.getValue());
+ }
+
+ // Below benchmarks are commented because CRC32C is unavailable in Java 8.
+// @Benchmark
+// @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+// "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+// })
+// public byte[] benchCrc32c()
+// {
+// CRC32C crc32C = new CRC32C();
+// crc32C.update(array);
+// return Longs.toByteArray(crc32C.getValue());
+// }
+//
+// @Benchmark
+// @Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM",
+// "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor",
+// "-XX:+UnlockDiagnosticVMOptions", "-XX:-UseCRC32CIntrinsics",
+// })
+// public byte[] benchCrc32cNoIntrinsic()
+// {
+// CRC32C crc32C = new CRC32C();
+// crc32C.update(array);
+// return Longs.toByteArray(crc32C.getValue());
+// }
+}
diff --git a/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java b/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
index 34cbb17..52dcd2d 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
@@ -35,7 +35,7 @@ import org.openjdk.jmh.infra.Blackhole;
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 1)
@Measurement(iterations = 30)
-@Fork(value = 1,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 1, jvmArgsAppend = "-Xmx512M")
@Threads(1)
@State(Scope.Benchmark)
public class DirectorySizerBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/FastThreadLocalBench.java b/test/microbench/org/apache/cassandra/test/microbench/FastThreadLocalBench.java
index 491dc44..ec24413 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/FastThreadLocalBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/FastThreadLocalBench.java
@@ -38,7 +38,7 @@ import org.openjdk.jmh.infra.Blackhole;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = {"-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
+@Fork(value = 1, jvmArgsAppend = {"-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
@Threads(4) // make sure this matches the number of _physical_cores_
@State(Scope.Benchmark)
public class FastThreadLocalBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/HashingBench.java b/test/microbench/org/apache/cassandra/test/microbench/HashingBench.java
index b6c81a6..d6bdeaa 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/HashingBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/HashingBench.java
@@ -43,7 +43,7 @@ import org.openjdk.jmh.annotations.Warmup;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
+@Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
@Threads(4) // make sure this matches the number of _physical_cores_
@State(Scope.Benchmark)
public class HashingBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java b/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
index 28e0da7..eaa74de 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
@@ -50,7 +50,7 @@ import org.openjdk.jmh.infra.Blackhole;
@OutputTimeUnit(TimeUnit.SECONDS)
@Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
+@Fork(value = 1, jvmArgsAppend = { "-Xmx512M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
@Threads(4) // make sure this matches the number of _physical_cores_
@State(Scope.Benchmark)
public class LatencyTrackingBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java b/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
index 4ab607f..a3446aa 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
@@ -54,7 +54,7 @@ import static org.apache.cassandra.net.Verb.ECHO_REQ;
@State(Scope.Thread)
@Warmup(iterations = 4, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 8, time = 4, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 1, jvmArgsAppend = "-Xmx512M")
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.SampleTime)
public class MessageOutBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java b/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
index 7a159a2..cd15646 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
@@ -35,7 +35,7 @@ import java.util.concurrent.TimeUnit;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 3,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 3, jvmArgsAppend = "-Xmx512M")
@Threads(1)
@State(Scope.Benchmark)
public class OutputStreamBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java b/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
index 73a2b71..b4b126f 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
@@ -46,7 +46,7 @@ import java.util.concurrent.TimeUnit;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 50, time = 1, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 3,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 3, jvmArgsAppend = "-Xmx512M")
@Threads(1)
@State(Scope.Benchmark)
public class PendingRangesBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/PreaggregatedByteBufsBench.java b/test/microbench/org/apache/cassandra/test/microbench/PreaggregatedByteBufsBench.java
index 9971cc5..5948cc8 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/PreaggregatedByteBufsBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/PreaggregatedByteBufsBench.java
@@ -37,7 +37,7 @@ import org.openjdk.jmh.annotations.Warmup;
@State(Scope.Thread)
@Warmup(iterations = 4, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 8, time = 4, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 1, jvmArgsAppend = "-Xmx512M")
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.SampleTime)
public class PreaggregatedByteBufsBench
diff --git a/test/microbench/org/apache/cassandra/test/microbench/Sample.java b/test/microbench/org/apache/cassandra/test/microbench/Sample.java
index 52f7c3e..a878a40 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/Sample.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/Sample.java
@@ -32,7 +32,7 @@ import java.util.concurrent.TimeUnit;
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 2, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1,jvmArgsAppend = "-Xmx512M")
+@Fork(value = 1, jvmArgsAppend = "-Xmx512M")
@Threads(1)
@State(Scope.Benchmark)
public class Sample
diff --git a/test/microbench/org/apache/cassandra/test/microbench/StringsEncodeBench.java b/test/microbench/org/apache/cassandra/test/microbench/StringsEncodeBench.java
index 5a1ccba..2193532 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/StringsEncodeBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/StringsEncodeBench.java
@@ -39,7 +39,7 @@ import org.openjdk.jmh.annotations.Warmup;
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 3, time = 1)
@Measurement(iterations = 6, time = 20)
-@Fork(value = 1,jvmArgsAppend = { "-Xmx256M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
+@Fork(value = 1, jvmArgsAppend = { "-Xmx256M", "-Djmh.executor=CUSTOM", "-Djmh.executor.class=org.apache.cassandra.test.microbench.FastThreadExecutor"})
@State(Scope.Benchmark)
public class StringsEncodeBench
{
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org