gpt4 book ai didi

java - 提高 for-each 性能

转载 作者:太空狗 更新时间:2023-10-29 14:58:47 28 4
gpt4 key购买 nike

我有以下 CountDownTimer 在我的 Android 应用程序中不断运行。

CountDownTimer timer_status;
timer_status = new CountDownTimer(1000,1000) {

List<Integer> lst = new ArrayList<Integer>();
int k=0;
@Override
public void onTick(long millisUntilFinished) {


String S = "";
k=0;
byte[] writeBuffer = new byte[8];

for (int value : lst) {

if(k==8) {
k=0;
S="";
}

S = S + String.format("%02x ", value).toUpperCase();
writeBuffer[k] = (byte) value;
k++;

}

editSent.setText(S);
}

在每个循环中,应用程序都会从​​ List 的整数中创建一个新的 byte[] 缓冲区。

它工作正常,但正在 LogCat 生成 GC_FOR_ALLOC

03-05 11:12:41.330: D/dalvikvm(21178): GC_FOR_ALLOC freed 511K, 19% free 4662K/5720K, paused 14ms, total 14ms
03-05 11:12:42.250: D/dalvikvm(21178): GC_FOR_ALLOC freed 511K, 19% free 4662K/5720K, paused 15ms, total 15ms

GC_FOR_ALLOC is triggered because there wasn't enough memory left on the heap to perform an allocation. Might be triggered when new objects are being created.

如何改进这个 foreach 循环,在堆上留下足够的内存?

最佳答案

 StringBuilder sb = new StringBuilder(); 
k=0;
byte[] writeBuffer = new byte[8];

for (int value : lst) {
if(k==8) { k=0; sb.setLength(0);
}
sb.append(String.format("%02x ", value));

writeBuffer[k] = (byte) value; k++;
}

editSent.setText(sb.toString().toUpperCase());

除了StringBuilder,我想指出的是普通的for在Android中比foreach有更好的性能,因为foreach 循环创建一个隐藏的 Iterator 对象。因此,请避免在 Android 的性能关键代码中使用 for-each。

另外,如果可能的话,对原始类型使用普通的 Array 而不是 ArrayList,因为自动装箱/拆箱会在每个循环中发生,这会影响您的性能。

关于java - 提高 for-each 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28879891/

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