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

标签 java garbage-collection coding-style

我有这两段代码(用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/

相关文章:

java - 如何测试 Guice Singleton?

java - SoftReference 过早地收集垃圾

python - 垃圾收集器使用了多少时间?

c++ - 为什么 C++ 中的所有内容都大写?

java - 如何在链表中为每个单独的链表输入一组新的节点

java - 如何从 String 转换为原始类型或标准 java Wrapper 类型

java - 比较字符串类型的日期

javascript - 你如何优化网络音频应用程序中的垃圾收集以避免点击噪音?

C++ 类访问说明符详细程度

c# - 带有引用类型参数的 ref 关键字