由于JIT,Bouncycastle AES 256多线程解密速度降低

时间:2012-05-03 19:31:37

标签: android encryption aes jit bouncycastle

我正在编写加密照片的应用程序,虽然它需要解密并在图库活动中显示缩略图。然后,您当然可以点击并查看不同活动中的全尺寸图像。 我使用256位密钥的AES / CBC / PKCS7Padding密码。我使用PBEWithSHA256And256BitAES-CBC-BC导出密钥并将其存储到内存中。然后,所有需要进行加密/解密的线程都是在内存中使用该密钥来初始化Cipher对象。

所以这是我的问题。当我同时解密许多图像时(假设我需要显示图库)并且在我尝试解密全尺寸图像之后,它非常慢。另一方面,如果我只解密一个图像(无论大小),那么去图库然后解密全尺寸图像它非常快。

我真的很困惑。

那么我做错了什么?也许Bouncy Castle Crypto库不是线程安全的?

更新:我发现这个问题与JIT有关。禁用JIT完全消除了任何处理速度差异。任何人都可以帮助理解如何优化代码以强制JIT在使用多线程解密照片时编译正确的部分代码以获得与开头时只解密一张照片相同的速度吗?

1 个答案:

答案 0 :(得分:3)

从上面的讨论中,性能下降的一个可能原因是工作线程数量很多。限制线程数的一种可能方法是使用java.util.concurrent中的类来使用固定(或上限)线程池。

您可以使用合适的Executors静态工厂方法创建固定线程池执行服务。然后,您可以创建用于解密单个缩略图的异步任务,并使用返回的ExecutorService实例的submit()方法填充GridView单元格。

另一种可能性可能是新的Loaders API(developer.android.com),但我不确定。我现在正在阅读它们以供我自己使用。所以你可能想查看文档。

另一个替代方案是this answer(stackoverflow.com)。