实例和迭代。哪一个更好?

时间:2012-11-19 19:38:38

标签: java performance iteration instantiation

我想阅读文件并处理它们。每次迭代都会处理一个文档。

哪种代码更好?

1

BufferedReader br;
for(File f : files)
{
    br = new BufferedReader(......);
    ......
}

2

for(File f : files)
{
    BufferedReader br = new BufferedReader(......);
    ......
}

我的观点是哪一个在空间和速度方面更有效?

6 个答案:

答案 0 :(得分:11)

后者在我看来更清晰。通常,更喜欢声明具有最小范围的局部变量,理想情况是在声明时初始化它们。

它不会直接影响性能 - 但会影响可读性和维护,这会影响您轻松进行 影响性能的更改。

一般来说:

  • 制定您的表现和行为要求(以及如何测试两者)
  • 编写最简单,最干净的代码,以实现您想要的行为
  • 查看它是否符合您的性能要求
  • 如果没有,请分析问题所在,并进行“最不干净”的改变以改​​善问题。 (这可能意味着进行设计更改而不是微优化。)
  • 泡沫,冲洗,重复,直到您的代码符合您的性能要求并且尽可能干净。

答案 1 :(得分:5)

  1. 它们完全相同,编译成字节码后所有差异都会丢失。
  2. 即使我们想象最糟糕的情况,理论上(在另一个Java中)可能相当于一次额外的内存写入,差异会非常小,以至于你需要世界上最精确的原子钟来测量它。 / LI>
  3. 你真正的不同之处应该在于代码的整体可维护性,这应该是一个更高的关注点,甚至比真正的速度差异低于2-3%。例如,许多设计模式会引入某种开销,但人们更愿意为它提供代码库的灵活性而付出代价。
  4. 在代码优化中,很容易陷入 Win Small,Lose Big 的陷阱:每个单独的方法都可以优化到完美,但整体系统性能可能仍然是一场灾难,因为全球架构的不足之处。必须始终优化自上而下,这样一来,如果被优化版本取代,您将看到只有1%或更少的代码行实际上可以为整体性能做出贡献。

答案 2 :(得分:3)

如果您不在其他地方使用br变量,则它们都完全相同。

注意不要在尝试纳米优化时浪费太多时间。即使字节码不同,在优化显而易见的情况下,JIT也不是那么糟糕。你不需要在使用它的块之前声明一个变量,你不应该因为它不太清楚它的用途。

答案 3 :(得分:1)

唯一的区别是br是第二种情况是在循环范围内是局部的,而在第一种情况下它可以在循环外访问。但是请注意,即使在第一种情况下,br ref变量也可以在outaide循环中使用,而不是你在for循环中给出的值。

否则他们就是一样的。虽然第二种情况更具可读性

答案 4 :(得分:0)

效率方面两者都相同,大部分时间都被编译为类似的字节码。

可读性方面,第二种方法更好。通常,当代码增长时,它会有很大帮助。特别是在调试时,你不必担心稍后在该块之外修改该变量。

答案 5 :(得分:0)

3

for(File f : files)
{
    try( BufferedReader br = new BufferedReader(......) )
    {
        ......
    }
}