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).