diff --git a/src/main/java/com/backblaze/erasure/CodingLoop.java b/src/main/java/com/backblaze/erasure/CodingLoop.java index 0eca0b1..0176b04 100644 --- a/src/main/java/com/backblaze/erasure/CodingLoop.java +++ b/src/main/java/com/backblaze/erasure/CodingLoop.java @@ -55,6 +55,12 @@ public interface CodingLoop { new OutputInputByteTableCodingLoop(), }; + /** + * The best implementation as determined by {@link ReedSolomonBenchmark} over + * {@link #ALL_CODING_LOOPS}. + */ + CodingLoop BEST_CODING_LOOP = new InputOutputByteTableCodingLoop(); + /** * Multiplies a subset of rows from a coding matrix by a full set of * input shards to produce some output shards. diff --git a/src/main/java/com/backblaze/erasure/ReedSolomon.java b/src/main/java/com/backblaze/erasure/ReedSolomon.java index 09f2194..c84481b 100644 --- a/src/main/java/com/backblaze/erasure/ReedSolomon.java +++ b/src/main/java/com/backblaze/erasure/ReedSolomon.java @@ -27,7 +27,7 @@ public class ReedSolomon { * Creates a ReedSolomon codec with the default coding loop. */ public static ReedSolomon create(int dataShardCount, int parityShardCount) { - return new ReedSolomon(dataShardCount, parityShardCount, new InputOutputByteTableCodingLoop()); + return new ReedSolomon(dataShardCount, parityShardCount, CodingLoop.BEST_CODING_LOOP); } /** diff --git a/src/main/java/com/backblaze/erasure/ReedSolomonBenchmark.java b/src/main/java/com/backblaze/erasure/ReedSolomonBenchmark.java index ffadeb4..d558ec9 100644 --- a/src/main/java/com/backblaze/erasure/ReedSolomonBenchmark.java +++ b/src/main/java/com/backblaze/erasure/ReedSolomonBenchmark.java @@ -32,6 +32,14 @@ public class ReedSolomonBenchmark { private static final long MEASUREMENT_DURATION = 2 * 1000; + private static final CodingLoop[] CODING_LOOPS = CodingLoop.ALL_CODING_LOOPS; + // alternatively, just benchmark the most-performant CodingLoop + // private static final CodingLoop[] CODING_LOOPS = new CodingLoop[] {CodingLoop.BEST_CODING_LOOP}; + + private static final int BANDWIDTH_COUNT = DATA_COUNT; + // alternatively, add parity shards for the bandwidth calculation, to compare with other implementations + // private static final int BANDWIDTH_COUNT = TOTAL_COUNT; + private static final Random random = new Random(); private int nextBuffer = 0; @@ -52,7 +60,7 @@ public void run() { List summaryLines = new ArrayList(); StringBuilder csv = new StringBuilder(); csv.append("Outer,Middle,Inner,Multiply,Encode,Check\n"); - for (CodingLoop codingLoop : CodingLoop.ALL_CODING_LOOPS) { + for (CodingLoop codingLoop : CODING_LOOPS) { Measurement encodeAverage = new Measurement(); { final String testName = codingLoop.getClass().getSimpleName() + " encodeParity"; @@ -113,7 +121,7 @@ private Measurement doOneEncodeMeasurement(ReedSolomon codec, BufferSet[] buffer codec.encodeParity(shards, 0, BUFFER_SIZE); long endTime = System.currentTimeMillis(); encodingTime += (endTime - startTime); - bytesEncoded += BUFFER_SIZE * DATA_COUNT; + bytesEncoded += BUFFER_SIZE * BANDWIDTH_COUNT; passesCompleted += 1; } double seconds = ((double)encodingTime) / 1000.0; @@ -139,7 +147,7 @@ private Measurement doOneCheckMeasurement(ReedSolomon codec, BufferSet[] bufferS } long endTime = System.currentTimeMillis(); checkingTime += (endTime - startTime); - bytesChecked += BUFFER_SIZE * DATA_COUNT; + bytesChecked += BUFFER_SIZE * BANDWIDTH_COUNT; passesCompleted += 1; } double seconds = ((double)checkingTime) / 1000.0;