8300808: Accelerate Base64 on x86 for AVX2

Reviewed-by: jbhateja, redestad, sviswanathan
This commit is contained in:
Scott Gibbons 2023-02-15 09:26:10 +00:00 committed by Claes Redestad
parent 46bcc4901e
commit 33bec20710
7 changed files with 229 additions and 26 deletions

View file

@ -31,18 +31,18 @@ import java.util.Random;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@BenchmarkMode(Mode.Throughput)
@OutputTimeUnit(TimeUnit.MILLISECONDS)
@State(Scope.Thread)
@Warmup(iterations = 4, time = 2)
@Measurement(iterations = 4, time = 2)
@Fork(value = 3)
public class Base64Decode {
private Base64.Encoder encoder, mimeEncoder;
private Base64.Decoder decoder, mimeDecoder;
private ArrayList<byte[]> encoded, mimeEncoded, errorEncoded;
private byte[] decoded, mimeDecoded, errorDecoded;
private Base64.Encoder encoder, mimeEncoder, urlEncoder;
private Base64.Decoder decoder, mimeDecoder, urlDecoder;
private ArrayList<byte[]> encoded, mimeEncoded, urlEncoded, errorEncoded;
private byte[] decoded, mimeDecoded, urlDecoded, errorDecoded;
private static final int TESTSIZE = 1000;
@ -60,6 +60,9 @@ public class Base64Decode {
@Param({"144"})
private int errorIndex;
@Param({"0"})
private int addSpecial;
@Setup
public void setup() {
Random r = new Random(1123);
@ -74,6 +77,11 @@ public class Base64Decode {
mimeDecoder = Base64.getMimeDecoder();
mimeEncoded = new ArrayList<byte[]> ();
urlDecoded = new byte[maxNumBytes + 1];
urlEncoder = Base64.getUrlEncoder();
urlDecoder = Base64.getUrlDecoder();
urlEncoded = new ArrayList<byte[]> ();
errorDecoded = new byte[errorIndex + 100];
errorEncoded = new ArrayList<byte[]> ();
@ -83,6 +91,10 @@ public class Base64Decode {
byte[] dst = new byte[((srcLen + 2) / 3) * 4];
r.nextBytes(src);
encoder.encode(src, dst);
if(addSpecial != 0){
dst[0] = '/';
dst[1] = '+';
}
encoded.add(dst);
int mimeSrcLen = 1 + r.nextInt(maxNumBytes);
@ -92,13 +104,24 @@ public class Base64Decode {
mimeEncoder.encode(mimeSrc, mimeDst);
mimeEncoded.add(mimeDst);
int urlSrcLen = 1 + r.nextInt(maxNumBytes);
byte[] urlSrc = new byte[urlSrcLen];
byte[] urlDst = new byte[((urlSrcLen + 2) / 3) * 4];
r.nextBytes(urlSrc);
urlEncoder.encode(urlSrc, urlDst);
if(addSpecial != 0){
urlDst[0] = '_';
urlDst[1] = '-';
}
urlEncoded.add(urlDst);
int errorSrcLen = errorIndex + r.nextInt(100);
byte[] errorSrc = new byte[errorSrcLen];
byte[] errorDst = new byte[(errorSrcLen + 2) / 3 * 4];
r.nextBytes(errorSrc);
encoder.encode(errorSrc, errorDst);
errorEncoded.add(errorDst);
errorDst[errorIndex] = (byte) '?';
errorEncoded.add(errorDst);
}
}
@ -120,6 +143,15 @@ public class Base64Decode {
}
}
@Benchmark
@OperationsPerInvocation(TESTSIZE)
public void testBase64URLDecode(Blackhole bh) {
for (byte[] s : urlEncoded) {
urlDecoder.decode(s, urlDecoded);
bh.consume(urlDecoded);
}
}
@Benchmark
@OperationsPerInvocation(TESTSIZE)
public void testBase64WithErrorInputsDecode (Blackhole bh) {