【发布时间】:2013-01-31 23:29:51
【问题描述】:
所以我一直在寻找一种更快的方法来计算 MD5 校验和并遇到了 Fast MD5 library - 但是当我在我的机器上使用 Java 7 对其进行基准测试时,它比 Java 版本慢。
要么我在做一些愚蠢的事情(很可能),要么 Java 7 实现了更好的算法(也很可能)。这是我超级简单的“基准”——也许我今天没有喝足够的咖啡……
MD5 digest = new MD5();
System.out.println(MD5.initNativeLibrary(true));
byte[] buff = IOUtils.readFully(new FileInputStream(new File("blahblah.bin")), 64000000, true);
ByteBuffer buffer = ByteBuffer.wrap(buff);
for (int j = 0; j < 100; j++) {
start = System.currentTimeMillis();
String md5Base64 = Utilities.getDigestBase64(buffer);
end = System.currentTimeMillis();
total = total + (end-start);
}
System.out.println("Took " + ((total)/100.00) + " ms. for " + buff.length+" bytes");
total = 0;
for (int i = 0; i < 100; i++) {
start = System.currentTimeMillis();
digest.Init();
digest.Update(buff);
digest.Final();
end = System.currentTimeMillis();
total = total + (end-start);
}
System.out.println("Took " + ((total)/100.00) + " ms. for " + buff.length+" bytes");
我得到:
Took 247.99 ms. for 64000000 bytes
Took 295.16 ms. for 64000000 bytes
根据评论,我一遍又一遍地运行 benchamrk,得到了最奇怪的结果。 FastMD5 计算保持不变,但 Java 7 版本变慢了。 ????
Took 246.54 ms. for 64000000 bytes
Took 294.69 ms. for 64000000 bytes
************************************
Took 540.55 ms. for 64000000 bytes
Took 292.69 ms. for 64000000 bytes
************************************
Took 537.07 ms. for 64000000 bytes
Took 292.12 ms. for 64000000 bytes
【问题讨论】:
-
这里看不到问题。
-
@SecurityMatt - 因为这就是我所需要的。
-
@Gandalf VM/JIT 需要时间来预热(取决于实现和设置) - 我会将 both 测试作为 pair循环> 多次(比如 100 次,因此每个 MD5 哈希执行 100x100 或更多),然后查看是否有任何变化。此外,total 是 in 毫秒,所以
total/100.00不再是毫秒 .. -
你能发个sscce吗?
-
@assylias 除非他的代码中存在明显的错误(请参阅我的回答),否则我相信 Gandalf 的结果非常合理。我认为判断基准的最佳方法是(a)尝试预测其结果,然后查看是否得到与此预测相当匹配的数字,以及(b)改变基准的参数(此处为数据大小)并检查对结果进行正确的更改(此处:带偏移的线性)。简单地使用声称做正确的事情的库并不会阻止优化,例如,也会弄乱你的结果。
标签: java performance md5 benchmarking