4

私のやり方が間違っているのでしょうか、それとも 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)で試したところ、処理速度は約12メガ/秒でした。2.2 (HTC Legend) で試したところ、速度は最初のデバイスよりもさらに遅くなりました。2.3から何かが変わったのでしょうか?

4

1 に答える 1

4

私のベンチマークによると、そのコードは120 kb / sよりもはるかに優れたパフォーマンスを簡単に発揮できるはずです(私は別のハードウェアで実行していますが、それでも)。

Traceviewを使用してコードをプロファイリングする場合、費やされる時間はどこですか?ボトルネックがFileInputStream.read()である場合は、次のことを考慮してください。

  • メディアインデックスアプリなど、他のアプリが同時にsdcardを使用している場合。他のアプリと帯域幅を共有すると、アプリのSDカード読み取りパフォーマンスに悪影響を及ぼします。
  • SDカード自体に問題がある場合。別のSDカードを試すか、お持ちのSDカードを再フォーマットしてください。

ボトルネックがMessageDigest.update()である場合(これは疑わしいです)、JNIソリューションを調べる必要があると思います。参考までに、SHA-1の実装はすでにネイティブコードに含まれていますが(android_message_digest_sha1.cppを参照)、ネイティブの<->Javaコピーを回避することで高速化できる可能性があります。

アップデート1(無視してください):

(プロファイリングに基づくと、問題はAndroidの最適化されたものを使用せずandroid.security.MessageDigest、代わりに使用することであるようですjava.security.MessageDigest。代わりに試してくださいandroid.security.MessageDigest。Android2.2と2.3の両方にネイティブのSHA-1実装がありandroid.security.MessageDigestます。)

アップデート2:

android.security.MessageDigest申し訳ありませんが、私は内部であることを忘れました。java.security.MessageDigestベンチマークでも使用していることに気づきました。私はAndroid2.3で実行していましたが、Android 2.3でのSHA-1実装はjava.security.MessageDigestネイティブコードでもあることがわかりましたが、Android2.2ではそうではないようです。

したがって、元の質問に対する答えは次のとおりです。はい、Javaの実装によりAndroid 2.2では非常に遅くなりますが、ネイティブコードでの実装により、Android2.3では大幅に高速になります。ネイティブコードで独自のSHA-1実装を使用する場合は、Android2.2でも同様のスピードアップが見られるはずです。

于 2011-10-31T16:05:06.603 に答える