【问题标题】:Is it preferable to pre-calculate condition statement part of for loop?是否最好预先计算 for 循环的条件语句部分?
【发布时间】:2018-12-30 08:28:09
【问题描述】:

例如

int offset = getOffset();
int count = getCount();
int limit = count + offset;
for (int i; i < limit; i++) {}

优于

int offset = getOffset();
int count = getCount();
for (int i; i < offset + count; i++) {}

如果 Java VM 在每次迭代中都进行添加,这听起来像是相当大的开销。但如果编译器足够聪明,可以将添加限制为单次,我想保持我的代码简短。

【问题讨论】:

  • 您需要在每次迭代时评估它。如果你评估一次它会导致无限循环
  • 任何体面的优化器都可能为您做到这一点。但是,由于这是一个非常小的“文本添加”,您不妨自己做并消除所有疑虑(以及在优化下编译代码的需要,这会产生(可能是不希望的)使调试更加困难的效果)。
  • wardziniak//我的意思是条件测试的附加部分,而不是条件测试本身。是的,这会造成无限循环
  • 您想知道这样做int limit = count + offset; 是否比遍历offset + count 更好。对于一个小的添加,它甚至不应该是重要的。相反,如果您的问题通过getOffset() + getCount() 循环比通过offset + count 循环更好,那么这取决于您的编程逻辑。这些方法是否在每次被调用时返回不同的值,或者它们是否执行了一些繁重的操作但返回相同的值?
  • 更重要的是让你的变量final,这样读者可以很容易地看到边界没有改变。

标签: java optimization coding-style


【解决方案1】:

过早的优化是万恶之源。

现在不用担心这个。


当您从循环中提取加法部分时,它确实只会被评估一次。一些编译器可能足够聪明,也可以对此进行优化,但有些可能不会。

几乎所有 CPU 进行 32 位整数相加所花费的时间难以置信。如果您使用分析器并发现 for 循环条件确实会导致性能问题,那么您应该取出添加并查看它是否有帮助。但是当你甚至没有/还没有发现问题时,担心它是没有意义的。


所以现在,根据您的想法编写代码。例如,对我来说,如果我在想“现在我需要重复这个(偏移量+计数)次......”,我会写

for (int i = 0 ; i < offset + count ; i++)

如果我在想“现在我需要计算我们循环了多少次,然后我会循环那么多次”,那么我会写:

int limit = offset + count;
for (int i = 0 ; i < limit ; i++)

【讨论】:

  • 完全同意您的意见,我只想补充一点,性能问题通常是您要处理的最后一个问题,提高性能并不是您阅读代码,而是使用一些分析工具来解决您在使用过程中最重要的延迟执行
  • 完全同意阿尔诺的观点。每当我使用我的分析器找出代码的哪一部分拖慢了我的应用程序时,我总是感到惊讶。通过阅读代码,您永远不会找到值得优化的地方。
  • 这对真正的开发人员来说是一个很好的成语,但我认为我的问题更多地属于计算机理论。类似哪种算法更好的东西。即使我不考虑优化,我仍然必须选择无论如何要使用哪种样式。
  • @JavaToTavaL 当我写代码时,我只是把脑子里的逻辑写出来。我通常对我正在编写的确切代码无意识。如果我在想“现在我们需要重复这个(偏移量+计数)次......”那么我会在循环头中写下加法。如果我在想“现在让我们计算我需要重复这个的次数”,那么我会在循环标题之外写下加法。只需选择您认为有意义的内容即可。
  • @JavaToTavaL 已编辑。
猜你喜欢
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2022-11-26
  • 1970-01-01
相关资源
最近更新 更多