gpt4 book ai didi

android多线程程序速度慢

转载 作者:行者123 更新时间:2023-11-29 21:13:54 25 4
gpt4 key购买 nike

我创建了一个新线程,我在其中做了大约 15 秒的大量工作,同时屏幕中央有一个旋转箭头。

问题是,旋转动画不流畅。

我使用 traceview 运行性能测试并得到下图: performaceGraph

上图中,第一行是主UI线程,第二行是我自己的线程,从中可以看出一开始4秒,我自己的线程工作负载很小,主线程可以承担几乎所有的 CPU 时间都在做动画渲染,所以动画很好。

但是在接下来的 1.5s 中,我的线程工作负载越来越重,并且主线程中出现了一些白色 block ,这表明动画暂停了一段时间,因为 CPU 从主线程中被占用到我的线程来做繁重的工作。这就是动画不流畅的原因。

追查部分发现BouncyCaSTLeProvider.init承担了大部分工作,对应代码如下:

SecretKey k = new SecretKeySpec(key.getBytes(), "AES");
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");
cipher.init(Cipher.ENCRYPT_MODE, k);
finalStr = new String(Base64.encode(cipher.doFinal(originalStr.getBytes())));

但我找不到不使用 BouncyCaSTLeProvider 的其他方法来执行 AES256Encrypt,我不知道是否有其他方法可以获得流畅的动画,所以我希望我能从您那里得到一些想法来优化程序,谢谢!

最佳答案

这可能不是您的工作线程占用的 CPU 太多,但我敢打赌它会搅动大量内存,而且是 Java 垃圾回收导致您的动画线程停滞不前。 Dalvik 可以进行并发 GC,但是它会在短暂的时间内暂停所有线程,并且某些 GC 不是并发的。查看您的 ADB logcat 输出并查找 GC 消息。我不知道 BouncyCaSTLeProvider 的细节,所以我不知道它在分配对象方面有多脏,但您可能无能为力。

需要注意的一点是尽量避免在动画线程中进行任何类型的 Java 分配。这将减少堆积起来等待 GC 处理的死对象的数量,并将减少某些脱离动画线程的 GC 使您的动画卡顿的可能性。 DDMS 中的内存工具可以帮助您查找正在分配的对象;其中许多并不明显。

作为旁注,您可以考虑设置线程优先级来为您的工作线程提供较低的优先级,并确保它不会使动画线程饿死,但这对 GC 暂停没有帮助——那些会停止世界.所以它可能对您的问题根本没有帮助。

关于android多线程程序速度慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955527/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com