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