Согласно моим тестам, этот код легко может работать лучше, чем 120 кбит / с (я работаю на другом оборудовании, но все же).
Если вы профилируете код с помощью Traceview , где будет потрачено время? Если узким местом является FileInputStream.read (), подумайте о:
- если какое-то другое приложение использует sdcard одновременно с вами, например приложение для индексации мультимедиа или что-то еще. Совместное использование полосы пропускания с каким-либо другим приложением отрицательно скажется на производительности чтения sdcard вашего приложения.
- Если проблема связана с самой SD-картой. Попробуйте другой sdcard или переформатируйте тот, который у вас есть.
Если узким местом является MessageDigest.update () (в чем я сомневаюсь), я полагаю, вам действительно нужно искать решение JNI. К вашему сведению, реализация SHA-1 уже реализована в собственном коде (см. android_message_digest_sha1.cpp ), но, возможно, вы можете получить ускорение, избегая некоторого собственного <-> Java-копирования.
Обновление 1 (пожалуйста, игнорируйте):
(Судя по вашему профилированию, проблема заключается в том, что вы используете не оптимизированный для Android android.security.MessageDigest
, а вместо этого java.security.MessageDigest
. Попробуйте вместо него android.security.MessageDigest
. И Android 2.2, и 2.3 имеют собственные реализации SHA-1 android.security.MessageDigest
.)
Обновление 2:
Извините, я забыл о том, что android.security.MessageDigest
является внутренним. Теперь я понимаю, что я также использовал java.security.MessageDigest
в своем тесте производительности. Хотя я работал на Android 2.3, и оказалось, что реализация SHA-1 java.security.MessageDigest
в Android 2.3 также написана на нативном коде, хотя на Android 2.2 это явно не так.
Таким образом, ответ на ваш первоначальный вопрос таков: Да, он мучительно медленный в Android 2.2 из-за реализации Java, но значительно быстрее в Android 2.3 из-за реализации в нативном коде. Вы должны увидеть аналогичные ускорения на Android 2.2, если вы используете свою собственную реализацию SHA-1 в собственном коде.