Created
September 10, 2014 16:18
-
-
Save komiya-atsushi/301ae973f7117f856b2f to your computer and use it in GitHub Desktop.
Java 8 で導入された Base64 エンコーディング/デコーディングの機能と Commons Codec のそれとの性能比較をするプログラム。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics; | |
import java.util.Base64; | |
import java.util.function.Function; | |
/** | |
* Java 8 と Commons Codec の Base64 エンコーディング・デコーディング性能を比較します。 | |
* | |
* 比較対象の Commons Codec と、パフォーマンス測定結果の統計処理のために Commons Math3 が必要になります。 | |
*/ | |
public class Base64Performance { | |
public static void main(String[] args) { | |
measureAndShowPerformance(300000, 40, 20); | |
measureAndShowPerformance(2000, 40, 20000); | |
} | |
static void measureAndShowPerformance(int loopTimes, int samplingTimes, int textLength) { | |
double[] encodingPerformanceByJava8 = | |
measureEncodingPerformance( | |
samplingTimes, | |
textLength, | |
data -> doEncodeByJava8(data, loopTimes)); | |
double[] encodingPerformanceByCommonsCodec = | |
measureEncodingPerformance( | |
samplingTimes, | |
textLength, | |
data -> doEncodeByCommonsCodec(data, loopTimes)); | |
double[] decodingPerformanceByJava8 = | |
measureDecodingPerformance( | |
samplingTimes, | |
textLength, | |
data -> doDecodeByJava8(data, loopTimes)); | |
double[] decodingPerformanceByCommonsCodec = | |
measureDecodingPerformance( | |
samplingTimes, | |
textLength, | |
data -> doDecodeByCommonsCodec(data, loopTimes)); | |
System.out.printf("# loop:%d, sampling:%d, text length:%d", loopTimes, samplingTimes, textLength); | |
System.out.println(); | |
showPerformance("Java8 Encoding", encodingPerformanceByJava8); | |
showPerformance("Commons Codec Encoding", encodingPerformanceByCommonsCodec); | |
showPerformance("Java8 Decoding", decodingPerformanceByJava8); | |
showPerformance("Commons Codec Decoding", decodingPerformanceByCommonsCodec); | |
} | |
static void showPerformance(String label, double[] result) { | |
DescriptiveStatistics stats = new DescriptiveStatistics(result); | |
System.out.println("## " + label); | |
System.out.println("* 1st quantile [ms] : " + stats.getPercentile(25)); | |
System.out.println("* median [ms] : " + stats.getPercentile(50)); | |
System.out.println("* 3rd quantile [ms] : " + stats.getPercentile(75)); | |
System.out.println(); | |
} | |
static double[] measureEncodingPerformance(int samplingTimes, int textLength, Function<byte[], Long> f) { | |
double[] result = new double[samplingTimes]; | |
byte[] data = generateText(textLength).getBytes(); | |
for (int i = 0; i < samplingTimes; i++) { | |
result[i] = f.apply(data); | |
} | |
return result; | |
} | |
static double[] measureDecodingPerformance(int samplingTimes, int textLength, Function<byte[], Long> f) { | |
double[] result = new double[samplingTimes]; | |
byte[] data = Base64.getEncoder().encode(generateText(textLength).getBytes()); | |
for (int i = 0; i < samplingTimes; i++) { | |
result[i] = f.apply(data); | |
} | |
return result; | |
} | |
static String generateText(int textLength) { | |
String seed = "012ABCabcz"; | |
StringBuilder sb = new StringBuilder(); | |
for (int i = 0; i < (textLength + seed.length() - 1) / seed.length(); i++) { | |
sb.append(seed); | |
} | |
return sb.toString() | |
.substring(0, textLength); | |
} | |
// ----- Java 8 Standard Class Library | |
static long doEncodeByJava8(byte[] data, int times) { | |
Base64.Encoder encoder = Base64.getEncoder(); | |
long begin = System.currentTimeMillis(); | |
for (int i = 0; i < times; i++) { | |
byte[] result = encoder.encode(data); | |
} | |
long end = System.currentTimeMillis(); | |
return end - begin; | |
} | |
static long doDecodeByJava8(byte[] data, int times) { | |
Base64.Decoder decoder = Base64.getDecoder(); | |
long begin = System.currentTimeMillis(); | |
for (int i = 0; i < times; i++) { | |
byte[] result = decoder.decode(data); | |
} | |
long end = System.currentTimeMillis(); | |
return end - begin; | |
} | |
// ----- Commons Codec | |
static long doEncodeByCommonsCodec(byte[] data, int times) { | |
long begin = System.currentTimeMillis(); | |
for (int i = 0; i < times; i++) { | |
byte[] result = org.apache.commons.codec.binary.Base64.encodeBase64(data); | |
} | |
long end = System.currentTimeMillis(); | |
return end - begin; | |
} | |
static long doDecodeByCommonsCodec(byte[] data, int times) { | |
long begin = System.currentTimeMillis(); | |
for (int i = 0; i < times; i++) { | |
byte[] result = org.apache.commons.codec.binary.Base64.decodeBase64(data); | |
} | |
long end = System.currentTimeMillis(); | |
return end - begin; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment