我做错了,还是Android的SHA1的JVM实现速度很慢?我的代码如下:
in = new FileInputStream("/mnt/sdcard/200mb");
MessageDigest digester = MessageDigest.getInstance("sha1");
byte[] bytes = new byte[8192];
int byteCount;
int total = 0;
while ((byteCount = in.read(bytes)) > 0) {
total += byteCount;
digester.update(bytes, 0, byteCount);
Log.d("sha", "processed " + total);
}
这是log:
10-31 13:59:53.790 D/sha ( 3386): processed 4931584
10-31 13:59:54.790 D/sha ( 3386): processed 5054464
10-31 13:59:55.780 D/sha ( 3386): processed 5177344
大约100k / sec,对我来说这是不可接受的。
我正在使用物理设备(LG P990,2.2.2)。我可以用Java获得更好的结果吗,或者我必须研究JNI实现?
我玩过缓冲区大小 - 没有显着差异。
所以似乎瓶颈在于更新哈希。
这很有趣。当我尝试2.3.2(SE Xperia)时,处理速度约为12meg / sec。当我尝试使用2.2(HTC Legend)时,速度甚至比第一台设备慢。可能是因为自2.3以来某些事情发生了变化吗?
答案 0 :(得分:3)
根据我的基准测试,该代码应该能够轻松地执行超过120 kb / s的速度(我在不同的硬件上运行,但仍然如此)。
如果您使用Traceview对代码进行分析,那么花费的时间在哪里?如果瓶颈是FileInputStream.read(),请考虑:
如果瓶颈是MessageDigest.update()(我怀疑),我想你确实需要研究一个JNI解决方案。为了您的信息,SHA-1实现已经使用本机代码(请参阅android_message_digest_sha1.cpp),但也许您可以通过避免某些原生的< - >来获得加速。 Java复制。
更新1(请忽略):
(根据您的分析,问题似乎是您不使用Android的优化android.security.MessageDigest
而是使用java.security.MessageDigest
。请尝试使用android.security.MessageDigest
。安卓2.2和2.3都有本机android.security.MessageDigest
的SHA-1实现。)
更新2:
抱歉,我忘了android.security.MessageDigest
是内部的。我现在意识到我在我的基准测试中也使用了java.security.MessageDigest
。虽然我在Android 2.3上运行,但事实证明Android 2.3中java.security.MessageDigest
的SHA-1实现也是本机代码,而Android 2.2上的情况并非如此。
因此,原始问题的答案是:是的,由于Java实现,它在Android 2.2中非常缓慢,但由于在本机代码中实现,因此在Android 2.3中显着更快。如果在本机代码中使用自己的SHA-1实现,则应该在Android 2.2上看到类似的加速。