gpt4 book ai didi

java - 编写高效代码和优化内存

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:01:17 25 4
gpt4 key购买 nike

我有这两段代码(用Java写的)哪个更高效?

int foo(){

int result;
for(int i = 0; i < n;i++){
SomeObject a,b,c;
a = new SomeObject();
b = new SomeObject();
c = new SomeObject();
//do something with a,b,c
//and derive result
}
return result;
}

int foo(){

int result;
SomeObject a,b,c;
a = new SomeObject();
b = new SomeObject();
c = new SomeObject();

for(int i = 0; i < n;i++){
a.flush(); //reset object do not create new though
b.flush(); //reset object do not create new though
c.flush(); //reset object do not create new though
//do something with a,b,c
//and derive result
}
return result;
}

在第二个片段中,我已将局部变量移出循环,因此实际上它只创建了它们的一个实例。这有什么改善吗?从逻辑上讲,当变量在循环内时才有意义。但是垃圾收集器会有效地清理对象吗?

编辑:更新了关于对象实例化的片段。

最佳答案

您已将变量 移出,但它们不是对象。假设您在循环的每次迭代中为 abc 分配不同的值,您根本没有减少内存分配- 您只是不必要地扩大了变量的范围。

如果您不需要在循环中更改abc 的值,那就另当别论了,并且最好在循环外而不是在每次迭代时分配它们。

不过,最主要的是要了解对象变量 之间的区别。特别是,在循环的每次迭代中创建"new"变量实际上不会产生任何成本。

编辑:好的,对于更新后的问题,显然在创建多少对象方面存在差异。然而,根据具体情况,第二种形式可能仍然更可取:它当然更容易理解,而且它不依赖于 flush 操作的细节。另一方面,如果创建 SomeObject 的实例代价高昂(例如,它会生成加密 key ),那么最好针对它进行优化。

简而言之:视情况而定。首先编写最易读的代码,对其进行测量,并将其与您的性能要求进行比较。只有在有明显好处时才转向不太明显的代码。

关于java - 编写高效代码和优化内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6354447/

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