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

Mun*_*ong 9 java iteration performance instantiation

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

哪种代码更好?

1.

BufferedReader br;
for(File f : files)
{
    br = new BufferedReader(......);
    ......
}
Run Code Online (Sandbox Code Playgroud)

2.

for(File f : files)
{
    BufferedReader br = new BufferedReader(......);
    ......
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 11

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

它不会直接影响性能-但它会影响可读性和维护,这将影响难易程度,您可以更改它影响性能.

一般来说:

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


Mar*_*nik 5

  1. 它们完全相同,编译成字节码后所有差异都会丢失.
  2. 即使我们想象最糟糕的情况,理论上(在另一个Java中)可能相当于一次额外的内存写入,但差异会非常小,以至于您需要世界上最精确的原子钟来测量它.
  3. 真正的区别在于你的代码的整体可维护性,这应该是一个高得多的关注,甚至比速度的真正差异低于2-3%.例如,许多设计模式会引入某种开销,但人们更愿意为它提供代码库的灵活性而付出代价.

在代码优化中,很容易陷入Win Small,Lose Big的陷阱:每个单独的方法都可以优化到完美,但由于全局架构的不足,整体系统性能可能仍然是一场灾难.必须始终优化自上而下,并且在这样做时,您将看到如果被优化版本替换,只有1%或更少的代码行实际上可以对整体性能做出贡献.


Den*_*ret 3

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

请注意不要在尝试纳米优化上浪费太多时间。即使字节码不同,JIT 在优化显而易见的内容时也不会那么糟糕。您不需要在使用变量的块之前声明变量,也不应该这样做,因为这会让人不太清楚它的用途。