Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Bouncycastle AES 256多线程解密速度因JIT而降低_Android_Encryption_Aes_Jit_Bouncycastle - Fatal编程技术网

Android Bouncycastle AES 256多线程解密速度因JIT而降低

Android Bouncycastle AES 256多线程解密速度因JIT而降低,android,encryption,aes,jit,bouncycastle,Android,Encryption,Aes,Jit,Bouncycastle,我写的应用程序,加密的照片,虽然它需要解密和显示缩略图在画廊一样的活动。当然,您可以单击并在不同的活动中看到完整大小的图像。 我使用的是带256位密钥的AES/CBC/PKCS7填充密码。我使用pbewithsha256和256biates CBC BC导出密码密钥,并将其存储到内存中。然后,所有需要进行加密/解密的线程都在使用内存中的密钥初始化密码对象 这就是我的问题。当我同时解密许多图像时(假设我需要显示gallery),并且在我尝试解密全尺寸图像后,速度非常慢。另一方面,如果我只解密一个图

我写的应用程序,加密的照片,虽然它需要解密和显示缩略图在画廊一样的活动。当然,您可以单击并在不同的活动中看到完整大小的图像。 我使用的是带256位密钥的AES/CBC/PKCS7填充密码。我使用pbewithsha256和256biates CBC BC导出密码密钥,并将其存储到内存中。然后,所有需要进行加密/解密的线程都在使用内存中的密钥初始化密码对象

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

我真的很困惑

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


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

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

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

另一种可能是新的(developer.android.com),但我不确定。我现在正在读关于它们的书,供我自己使用。因此,您可能需要检查文档


另一种选择是(stackoverflow.com)。

线程安全有不同的含义。如何使用Bouncy Castle?用户输入密码,我使用PBEWITHSA256和256BITAES CBC BC算法导出256位加密密钥。然后我使用cipher.getInstance(“AES/CBC/PKCS7Padding”,“bc”)初始化解密密码。我正在使用标准的CipherInputStream来解密文件。仅此而已。特别是如果您在线程之间共享任何实例,您可以轻松更改您使用的线程数吗?我猜想,绘制时间与线程数的关系图,您将看到,在4或5个线程之后,您实际上开始失去性能(取决于手机上的内核数)。我怀疑的是,大量CPU绑定线程导致JIT编译器线程不足,而JIT基础结构的其余部分只是浪费时间来标识要重复编译的相同代码跟踪。线程数量取决于GridView调用getView()的次数在单独的线程中进行解密并显示缩略图。我认为最好的解决方案是在单线程中逐个解密缩略图,并将解密后的数据放入内存缓存中,供GridView以后使用。在这种情况下,我不会同时进行解密。你怎么想?也许你可以建议更好的解决方案?很好的发现vhallac,我没想到会有这么多线程。我当然会将线程的数量限制在处理器内核的数量上(超线程或非超线程),并使用并发实用程序。