Android SHA1非常慢

时间:2011-10-31 12:04:30

标签: java android performance java-native-interface sha

我做错了,还是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实现?

我玩过缓冲区大小 - 没有显着差异。

Traceview结果

所以似乎瓶颈在于更新哈希。

enter image description here

研究

这很有趣。当我尝试2.3.2(SE Xperia)时,处理速度约为12meg / sec。当我尝试使用2.2(HTC Legend)时,速度甚至比第一台设备慢。可能是因为自2.3以来某些事情发生了变化吗?

1 个答案:

答案 0 :(得分:3)

根据我的基准测试,该代码应该能够轻松地执行超过120 kb / s的速度(我在不同的硬件上运行,但仍然如此)。

如果您使用Traceview对代码进行分析,那么花费的时间在哪里?如果瓶颈是FileInputStream.read(),请考虑:

  • 如果其他应用程序与您同时使用sdcard,就像媒体索引应用程序或其他东西。与其他应用共享带宽会对应用的SD卡读取性能产生负面影响。
  • 如果sdcard本身就是问题。尝试使用另一张SD卡或重新格式化你的SD卡。

如果瓶颈是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上看到类似的加速。