【问题标题】:Instances and iterations. Which one is better?实例和迭代。哪一个更好?
【发布时间】:2012-11-07 19:01:41
【问题描述】:

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

哪种代码更好?

1.

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

2.

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

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

【问题讨论】:

  • @FedericoCristina 标头更新(y)

标签: java performance iteration instantiation


【解决方案1】:

在我看来,后者更清楚。一般来说,更倾向于声明具有最小范围的局部变量,最好在声明时初始化它们。

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

一般:

  • 制定您的性能和行为要求(以及如何测试两者)
  • 编写最简单、最干净的代码来实现您想要的行为
  • 看看它是否满足您的性能要求
  • 如果不是,请分析问题出在哪里,并进行“最不干净”的更改以改善问题。 (这可能意味着进行设计更改而不是微优化。)
  • 起泡、冲洗、重复,直到获得满足性能要求且尽可能干净的代码。

【讨论】:

  • 打印这个答案并挂在我的隔间里。
【解决方案2】:
  1. 它们完全相同,编译成字节码后所有差异都丢失了。
  2. 即使我们想象最糟糕的情况,理论上(在另一个 Java 中)可能相当于一次额外的内存写入,但差异会非常小,以至于您需要世界上最精确的原子钟来测量它。
  3. 对您而言,真正的区别应该在于代码的整体可维护性,这应该比低于 2-3% 的实际速度差异更令人担忧。例如,许多设计模式引入了某种开销,但人们更愿意为它为代码库提供的灵活性付出代价。

在代码优化中很容易陷入Win Small, Lose Big的陷阱:每个单独的方法都可能优化到完美,但由于全球架构的不足之处。必须始终自上而下进行优化,当这样做时,您会发现如果替换为优化版本,实际上只有 1% 或更少的代码行可以提高整体性能。

【讨论】:

  • 如果我没记错的话,1) 不正确:br 在第二个示例中的循环结束后不再定义,一旦它离开了定义的范围。这使得维护更容易,因为您不会意外重用变量。
  • @izkata 1) 不是关于维护的差异,而是关于运行时效率的差异。编译器很容易检测到br 的使用以for 循环结束,并将其视为在内部声明。
【解决方案3】:

如果您不在其他地方使用 br 变量,它们完全一样。

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        3.

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

        【讨论】:

          猜你喜欢
          • 2017-08-06
          • 2014-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-01
          • 1970-01-01
          • 2010-11-06
          • 2017-01-10
          相关资源
          最近更新 更多