Bouncycastle AES 256 многопоточность снижение скорости дешифрования из-за JIT

Я пишу приложение, которое зашифровывает фотографии и, хотя оно требует расшифровки и отображения эскизов в галерее, как активность. Тогда, конечно, вы можете нажать и увидеть полноразмерное изображение в другой деятельности. Я использую шифр AES/CBC/PKCS7Padding с 256-битным ключом. Я получаю ключ шифрования с помощью PBEWithSHA256And256BitAES-CBC-BC и сохраняю его в памяти. Затем все потоки, которым необходимо выполнить шифрование / дешифрование, используют этот ключ из памяти, инициализируя с ним объект Cipher.

Итак, вот моя проблема. Когда я дешифрую много изображений одновременно (скажем, мне нужно показать галерею) и после того, как я пытаюсь расшифровать полноразмерное изображение, это происходит очень медленно. С другой стороны, если я расшифрую только одно изображение (независимо от его размера), перейду в галерею и расшифрую полноразмерное изображение, это очень быстро.

Я действительно смущен.

Так что я делаю не так? Может быть, библиотека Bouncy Castle Crypto не является поточно-ориентированной?

ОБНОВЛЕНИЕ: я узнал, что эта проблема связана с JIT. Отключение JIT полностью устраняет любую разницу в скорости обработки. Может кто-нибудь помочь понять, как оптимизировать код, чтобы заставить JIT компилировать правильную часть кода при дешифровании фотографий с многопоточностью, чтобы получить такую ​​же скорость, как если бы дешифровывала только одну фотографию в начале?

1 ответ

Решение

Из нашего обсуждения выше, вероятным виновником снижения производительности является большое количество рабочих потоков. Одним из возможных способов ограничения количества потоков является использование фиксированного (или ограниченного) пула потоков с использованием классов, найденных в java.util.concurrent,

Вы можете создать фиксированную службу выполнения пула потоков, используя подходящий Executors статический фабричный метод. Затем вы можете создавать асинхронные задачи для расшифровки отдельных миниатюр и заполнения ячеек GridView, используя возвращенные ExecutorService экземпляра submit() метод.

Другой возможностью может быть новый API Loaders (developer.android.com), но я не уверен. Я читаю о них прямо сейчас для себя. Так что вы можете проверить документацию.

Еще одна альтернатива в этом ответе (stackru.com).

Другие вопросы по тегам