2

写真を暗号化するアプリケーションを作成していますが、ギャラリーのようなアクティビティで復号化してサムネイルを表示する必要があります。もちろん、別のアクティビティでフルサイズの画像をクリックして表示することもできます。AES/CBC/PKCS7Padding 暗号を 256 ビット キーで使用しています。PBEWithSHA256And256BitAES-CBC-BC を使用して暗号鍵を導出し、メモリに格納します。次に、暗号化/復号化を行う必要があるすべてのスレッドは、メモリからそのキーを使用して Cipher オブジェクトを初期化します。

だからここに私の問題があります。多くの画像を同時に復号化すると (ギャラリーを表示する必要があるとしましょう)、フルサイズの画像を復号化しようとすると、非常に遅くなります。一方、(サイズに関係なく)1つの画像のみを復号化すると、ギャラリーに移動してフルサイズの画像を復号化すると非常に高速です。

私は本当に混乱しています。

それで、私は何を間違っていますか?Bouncy Castle Crypto ライブラリはスレッドセーフではないのでしょうか?

更新:この問題は JIT に関連していることがわかりました。JIT を無効にすると、処理速度の違いが完全になくなります。マルチスレッドで写真を復号化するときにコードの正しい部分をJITコンパイルして、最初に1枚の写真だけを復号化するのと同じ速度を得るためにコードを最適化する方法を理解するのを手伝ってくれる人はいますか?

4

1 に答える 1

3

上記の説明から、パフォーマンス低下の原因として考えられるのは、多数のワーカー スレッドです。スレッド数を制限する方法の 1 つは、 にあるクラスを使用して、固定 (または上限付き) スレッド プールを使用することですjava.util.concurrent

Executors適切な静的ファクトリ メソッドを使用して、固定スレッド プール実行サービスを作成できます。ExecutorService次に、個々のサムネイルを復号化し、返されたインスタンスのsubmit()メソッドを使用して GridView セルを設定するための非同期タスクを作成できます。

もう 1 つの可能性は、新しいローダー API (developer.android.com) かもしれませんが、よくわかりません。私は今、自分で使用するためにそれらについて読んでいます。そのため、ドキュメントを確認することをお勧めします。

さらに別の選択肢がこの回答にあります(stackoverflow.com)。

于 2012-05-07T10:53:13.327 に答える