【发布时间】:2011-12-12 09:48:17
【问题描述】:
我发现在 java 中计算 sha256 很慢。例如,它比 python 慢。我写了两个简单的基准来计算 1GB 零的 sha256。在这两种情况下,结果都是相同且正确的,但是 python 时间是 5653 毫秒,而 java 时间是 8623 毫秒(慢了 53%)。结果每次都相似,这对我来说是一个重要的区别。
如何让java中的计算更快?
基准测试:
Java:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class BenchmarkSha256 {
public static void main(String... args) throws NoSuchAlgorithmException {
int size = 1024 * 1024;
byte[] bytes = new byte[size];
MessageDigest md = MessageDigest.getInstance("SHA-256");
long startTime = System.nanoTime();
for (int i = 0; i < 1024; i++)
md.update(bytes, 0, size);
long endTime = System.nanoTime();
System.out.println(String.format("%1$064x", new java.math.BigInteger(1, md.digest())));
System.out.println(String.format("%d ms", (endTime - startTime) / 1000000));
}
}
Python:
#!/usr/bin/env python
import hashlib
import time
size = 1024 * 1024
bytes = bytearray(size)
md = hashlib.sha256()
startTime = time.time()
for i in range(0, 1024):
md.update(bytes)
endTime = time.time()
print "%s\n%d ms" % (md.hexdigest(), (endTime - startTime) * 1000)
结果:
~> java BenchmarkSha256
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
8623 ms
~> python BenchmarkSha256.py
49bc20df15e412a64472421e13fe86ff1c5165e18b2afccf160d4dc19fe68a14
5653 ms
java 和 python 的版本:
~> java -version
java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
~> python --version
Python 2.7
【问题讨论】:
-
您是否排除了两种情况下启动环境的成本,或者您是否对整个程序时间感兴趣而不是算法时间? (两者都是值得询问的问题,但它们是非常不同的指标。)
-
@DonalFellows 我只对算法时间感兴趣。在这种规模下,启动时间并不那么重要。我试图评论“md.update(bytes, 0, size);” java代码中的一行,除计算外,整个过程时间为0.4s。即使减去这个时间,它仍然更慢。
-
@DonalFellows 我认为这不是重复的,因为在引用的问题/答案中涉及很多文件 I/O,这里我对纯哈希计算感兴趣。
-
我怀疑摘要使用 Java 而不是汇编库。您可以使用 Java 中的 cryptopp.com/benchmarks.html。
标签: java optimization sha256 sha