From ad96bdaea7257d85d40894ec4febc732c499bcc7 Mon Sep 17 00:00:00 2001 From: John Viegas Date: Fri, 8 Nov 2024 19:17:55 -0800 Subject: [PATCH 1/4] Adding Benchmark test for Checksums --- .../benchmark/checksum/CheckSumBenchmark.java | 124 ++++++++++++++++++ 1 file changed, 124 insertions(+) create mode 100644 test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java new file mode 100644 index 000000000000..086078e38125 --- /dev/null +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java @@ -0,0 +1,124 @@ +/* + * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"). + * You may not use this file except in compliance with the License. + * A copy of the License is located at + * + * http://aws.amazon.com/apache2.0 + * + * or in the "license" file accompanying this file. This file 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 software.amazon.awssdk.benchmark.checksum; + +import java.util.Locale; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Fork; +import org.openjdk.jmh.annotations.Level; +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.Warmup; +import org.openjdk.jmh.infra.Blackhole; +import java.nio.charset.StandardCharsets; +import java.util.concurrent.TimeUnit; +import software.amazon.awssdk.checksums.DefaultChecksumAlgorithm; +import software.amazon.awssdk.checksums.SdkChecksum; + +@State(Scope.Benchmark) +@Warmup(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.NANOSECONDS) +public class CheckSumBenchmark { + @State(Scope.Thread) + public static class ChecksumState { + + @Param( {"128B", "4KB", "128KB", "1MB"}) + public String size; + + @Param( {"MD5", "CRC32", "CRC32C", "SHA1", "SHA256"}) + public String checksumProvider; + + private byte[] payload; + private SdkChecksum sdkChecksum; + + @Setup(Level.Trial) + public void setup() { + // Initialize the correct checksum provider based on the parameter + switch (checksumProvider.toUpperCase(Locale.ROOT)) { + case "MD5": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.MD5); + break; + case "CRC32": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.CRC32); + break; + case "CRC32C": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.CRC32C); + break; + case "SHA1": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.SHA1); + break; + case "SHA256": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.SHA256); + break; + + default: + throw new IllegalArgumentException("Invalid checksumProvider: " + checksumProvider); + } + // Initialize the payload based on the size parameter + switch (size) { + case "128B": + payload = generateStringOfSize(128).getBytes(StandardCharsets.UTF_8); + break; + case "4KB": + payload = generateStringOfSize(4 * 1024).getBytes(StandardCharsets.UTF_8); + break; + case "128KB": + payload = generateStringOfSize(128 * 1024).getBytes(StandardCharsets.UTF_8); + break; + case "1MB": + payload = generateStringOfSize(1000 * 1024).getBytes(StandardCharsets.UTF_8); + break; + default: + throw new IllegalArgumentException("Invalid size: " + size); + } + } + } + + @Benchmark + public void updateEntireByteArrayChecksum(ChecksumState state, Blackhole blackhole) { + state.sdkChecksum.reset(); // Ensure we reset the checksum before each run + state.sdkChecksum.update(state.payload); + state.sdkChecksum.getChecksumBytes(); + blackhole.consume(state.sdkChecksum); + } + + @Benchmark + public void updateIndividualByteChecksumOneByteATime(ChecksumState state, Blackhole blackhole) { + state.sdkChecksum.reset();// Ensure we reset the checksum before each run + for (byte b : state.payload) { + state.sdkChecksum.update(b); + } + state.sdkChecksum.getChecksumBytes(); + blackhole.consume(state.sdkChecksum); + } + + private static String generateStringOfSize(int byteSize) { + String result = new String(new char[byteSize]).replace('\0', 'A'); // Approximate + while (result.getBytes(StandardCharsets.UTF_8).length > byteSize) { + result = result.substring(0, result.length() - 1); // Adjust to exact size + } + return result; + } +} From 958c4876979d6e9ec7ea6bd01fd2b38e980d9936 Mon Sep 17 00:00:00 2001 From: John Viegas Date: Fri, 22 Nov 2024 05:46:05 +0530 Subject: [PATCH 2/4] Addressed PR comments --- ...mBenchmark.java => ChecksumBenchmark.java} | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) rename test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/{CheckSumBenchmark.java => ChecksumBenchmark.java} (89%) diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java similarity index 89% rename from test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java rename to test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java index 086078e38125..af6d1ee16718 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/CheckSumBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java @@ -27,6 +27,7 @@ import org.openjdk.jmh.annotations.Scope; import org.openjdk.jmh.annotations.Setup; import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.Blackhole; import java.nio.charset.StandardCharsets; @@ -35,19 +36,19 @@ import software.amazon.awssdk.checksums.SdkChecksum; @State(Scope.Benchmark) -@Warmup(iterations = 3, time = 3, timeUnit = TimeUnit.SECONDS) -@Measurement(iterations = 5, time = 5, timeUnit = TimeUnit.SECONDS) -@Fork(1) +@Warmup(iterations = 3, time = 15, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 10, timeUnit = TimeUnit.SECONDS) +@Fork(2) @BenchmarkMode(Mode.AverageTime) @OutputTimeUnit(TimeUnit.NANOSECONDS) -public class CheckSumBenchmark { +public class ChecksumBenchmark { @State(Scope.Thread) public static class ChecksumState { @Param( {"128B", "4KB", "128KB", "1MB"}) public String size; - @Param( {"MD5", "CRC32", "CRC32C", "SHA1", "SHA256"}) + @Param( {"MD5", "CRC32", "CRC32C", "SHA1", "SHA256","CRC64NVME"}) public String checksumProvider; private byte[] payload; @@ -72,6 +73,9 @@ public void setup() { case "SHA256": sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.SHA256); break; + case "CRC64NVME": + sdkChecksum = SdkChecksum.forAlgorithm(DefaultChecksumAlgorithm.CRC64NVME); + break; default: throw new IllegalArgumentException("Invalid checksumProvider: " + checksumProvider); @@ -98,12 +102,16 @@ public void setup() { @Benchmark public void updateEntireByteArrayChecksum(ChecksumState state, Blackhole blackhole) { - state.sdkChecksum.reset(); // Ensure we reset the checksum before each run state.sdkChecksum.update(state.payload); state.sdkChecksum.getChecksumBytes(); blackhole.consume(state.sdkChecksum); } + @TearDown + public void tearDown(ChecksumState state) { + state.sdkChecksum.reset(); + } + @Benchmark public void updateIndividualByteChecksumOneByteATime(ChecksumState state, Blackhole blackhole) { state.sdkChecksum.reset();// Ensure we reset the checksum before each run From 34420fca0c2dba91c7c80fab0d74913c6f6e0ffc Mon Sep 17 00:00:00 2001 From: John Viegas Date: Wed, 27 Nov 2024 09:35:28 -0800 Subject: [PATCH 3/4] Addressed PR comments --- .../amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java | 1 - 1 file changed, 1 deletion(-) diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java index af6d1ee16718..d0e2b0f378b1 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java @@ -114,7 +114,6 @@ public void tearDown(ChecksumState state) { @Benchmark public void updateIndividualByteChecksumOneByteATime(ChecksumState state, Blackhole blackhole) { - state.sdkChecksum.reset();// Ensure we reset the checksum before each run for (byte b : state.payload) { state.sdkChecksum.update(b); } From 5ceb5992634a44ed9cefa97dd56ebba9a6556ab2 Mon Sep 17 00:00:00 2001 From: John Viegas Date: Wed, 27 Nov 2024 11:18:05 -0800 Subject: [PATCH 4/4] Checkstyle issue fixed --- .../awssdk/benchmark/checksum/ChecksumBenchmark.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java index d0e2b0f378b1..a4a3b804b4ea 100644 --- a/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java +++ b/test/sdk-benchmarks/src/main/java/software/amazon/awssdk/benchmark/checksum/ChecksumBenchmark.java @@ -15,7 +15,9 @@ package software.amazon.awssdk.benchmark.checksum; +import java.nio.charset.StandardCharsets; import java.util.Locale; +import java.util.concurrent.TimeUnit; import org.openjdk.jmh.annotations.Benchmark; import org.openjdk.jmh.annotations.BenchmarkMode; import org.openjdk.jmh.annotations.Fork; @@ -30,8 +32,6 @@ import org.openjdk.jmh.annotations.TearDown; import org.openjdk.jmh.annotations.Warmup; import org.openjdk.jmh.infra.Blackhole; -import java.nio.charset.StandardCharsets; -import java.util.concurrent.TimeUnit; import software.amazon.awssdk.checksums.DefaultChecksumAlgorithm; import software.amazon.awssdk.checksums.SdkChecksum; @@ -45,10 +45,10 @@ public class ChecksumBenchmark { @State(Scope.Thread) public static class ChecksumState { - @Param( {"128B", "4KB", "128KB", "1MB"}) + @Param({"128B", "4KB", "128KB", "1MB"}) public String size; - @Param( {"MD5", "CRC32", "CRC32C", "SHA1", "SHA256","CRC64NVME"}) + @Param({"MD5", "CRC32", "CRC32C", "SHA1", "SHA256", "CRC64NVME"}) public String checksumProvider; private byte[] payload;