哪种编程实践更快?

时间:2011-07-28 18:00:55

标签: java optimization

我用Java创建了一个小应用程序,因为我不是java专家所以我的程序效率不高(效率我的意思是更少的执行时间,即我想要更快的结果)。 如果有经验的人会回答我的以下问题,我将感激不尽:

哪一个更快:

问题1

boolean b1;
b1=true;

boolean b1= true;

问题2

boolean b1;
boolean b2;

boolean b1, b2;

问题3

for (int index goes to some iterations)
{
MyCustomClass obj = new MyCustomClass ();
//Some other code goes here
}

MyCustomClass obj = new MyCustomClass ();
for (int index goes to some iterations)
{
obj.Reset();// Assume .Reset() have same codes as zero argument constructor has
//Some other code goes here
}

提前致谢

5 个答案:

答案 0 :(得分:10)

  1. 都不是。这甚至不是微优化。
  2. 没有...
  3. 取决于Reset()与创建新对象相比产生的垃圾量。

答案 1 :(得分:6)

1)他们是一样的。它们至少会被编译成相同的字节代码。

2)同样的事情。

3)第二个更好,因为它在循环中没有构造函数,它将占用更少的内存并减少垃圾收集器的工作。

答案 2 :(得分:5)

问题1和问题2产生相同的字节代码

对于问题3,取决于您的对象,但除非必要,否则通常不会在循环中创建新对象。

答案 3 :(得分:4)

对于问题1和问题2,我怀疑它们会编译为相同的字节码。这可以通过实际编译两个仅在这方面不同的类文件并查看字节码来轻松测试。老实说,我不明白为什么他们不会被优化到相同的代码中,但我不是Java编译器的专家。即使它确实重要,但差异会很小,以至于在整个系统的性能方面最终都无关紧要。

对于问题3,重置对象可能会更快。对象创建相对昂贵。静态分析工具(例如FindBugs和PMD)实际上在循环内查找对象并标记它。当然,它完全取决于Reset()正在做什么。

与任何“优化”一样,要小心。首先编写最易读的代码。然后,测试应用程序。如果性能存在问题,请首先查找瓶颈并确定性能最差的区域。

答案 4 :(得分:1)

通常,无论您如何编码,编译器(对于任何语言)都知道如何优化结果。所以,对于开头的问题,我认为没关系。

对于最后一个:如果你在循环中创建一个新对象,它将会浪费一些时间来创建它:内存分配等。

如果你在循环之外创建它,并且它们只是在循环中调用一个方法,它应该更快,因为它不需要处理所有的内存分配等。