【发布时间】:2011-11-01 18:00:42
【问题描述】:
是我做错了,还是 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);
}
这里是日志:
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/秒,对我来说是不可接受的。
我正在使用物理设备(LG P990,2.2.2)。我可以使用 Java 获得更好的结果,还是必须研究 JNI 实现?
我玩过缓冲区大小 - 没有显着差异。
跟踪查看结果
看来瓶颈在于更新哈希。
研究
这很有趣。当我尝试 2.3.2 (SE Xperia) 时,处理速度约为 12meg/sec。当我尝试 2.2 (HTC Legend) 时,速度甚至比第一台设备还要慢。会不会是从 2.3 开始发生了一些变化?
【问题讨论】:
-
将日志移出循环并再次测试
-
以一种在兆字节发生变化时打印消息的方式实现日志记录 - 结果相同(120kb/秒)
-
对什么是阅读时间和什么是哈希时间进行基准测试,您可能会花更多的时间阅读您认为的阅读时间。还可以尝试使用不同的缓冲区大小,增加它可能会有很大帮助,8k 块可能比你卡上的文件系统块小。
-
添加了 traceview 结果。我玩过缓冲区大小 - 没有显着差异。
-
在 iOS 上,我每秒可以获得接近 10m 的哈希值,这是在 SHA256 环境中......使用三星 Galaxy S5 我看到每秒大约 150k 的哈希值。老实说,iOS 和 Android 之间的性能差异令人尴尬。
标签: java android performance java-native-interface sha