9

I wanna read documents and process them. Each iteration processes one document.

Which kind of code is better?

1.

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

2.

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

My point is which one is more efficient in terms of space and speed?

4

6 回答 6

11

在我看来,后者更清楚。一般来说,更喜欢用尽可能小的范围声明局部变量,理想情况下在声明点初始化它们。

它不会直接影响性能 - 但会影响可读性和维护,这会影响您进行更改的难易程度,从而影响性能。

一般来说:

  • 制定你的表现和行为要求(以及你将如何测试两者)
  • 编写实现你想要的行为的最简单、最干净的代码
  • 看看它是否满足您的性能要求
  • 如果不是,请分析问题出在哪里,并做出“最少不干净”的更改以改进事情。(这可能意味着进行设计更改而不是微优化。)
  • 起泡、冲洗、重复,直到您的代码满足您的性能要求并且尽可能干净。
于 2012-11-19T19:40:40.463 回答
5
  1. 它们完全相同,编译成字节码后所有差异都将丢失。
  2. 即使我们想象最糟糕的情况,理论上(在另一个 Java 中)可能相当于一次额外的内存写入,但差异会非常小,以至于您需要世界上最精确的原子钟来测量它。
  3. 对您而言,真正的区别应该在于代码的整体可维护性,这应该比低于 2-3% 的实际速度差异更令人担忧。例如,许多设计模式引入了某种开销,但人们更愿意为它为代码库提供的灵活性付出代价。

在代码优化中很容易陷入小胜大败的陷阱:每个单独的方法可能优化到完美,但由于全局架构的不足,整体系统性能仍然可能是灾难。必须始终自上而下进行优化,这样做时,您会发现如果替换为优化版本,实际上只有 1% 或更少的代码行对整体性能有贡献。

于 2012-11-19T19:41:05.910 回答
3

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

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

于 2012-11-19T19:39:38.537 回答
1

唯一的区别是br第二种情况在循环范围内是本地的,而在第一种情况下它可以在循环外访问。但请注意,即使在第一种情况下,brref 变量也可以在循环外使用,而不是您在 for 循环中提供的值。

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

于 2012-11-19T19:44:00.573 回答
0

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

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

于 2012-11-19T19:42:05.937 回答
0

3.

for(File f : files)
{
    try( BufferedReader br = new BufferedReader(......) )
    {
        ......
    }
}
于 2012-11-19T20:19:47.483 回答