循环时花费更多; 作业或if语句?

hei*_*kim 17 performance variable-assignment

考虑以下两种情况:

boolean b = false;
int i = 0;
while(i++ < 5) {
    b = true;
}
Run Code Online (Sandbox Code Playgroud)

要么

boolean b = false;
int i = 0;
while(i++ < 5) {
    if(!b) {
        b = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

哪个更"昂贵"呢?如果答案取决于使用的语言/编译器,请提供.我的主要编程语言是Java.

请不要问我为什么要这样做的问题..它们只是指出相关的准系统示例:应该在循环中反复设置相同的值,还是应该在每个循环上测试它它拥有改变所需的价值?

And*_*ter 29

请不要忘记优化俱乐部的规则.

  1. 优化俱乐部的第一条规则是,您不优化.
  2. 优化俱乐部的第二条规则是,如果不进行测量,则不进行优化.
  3. 如果您的应用程序运行速度超过底层传输协议,则优化结束.
  4. 一次一个因素.
  5. 没有marketroids,没有marketroid时间表.
  6. 只要必要,测试就会继续进行.
  7. 如果这是您在优化俱乐部的第一个晚上,您必须编写测试用例.

你似乎违反了规则2.你没有衡量标准.如果您真的想知道,您将通过设置针对方案B运行方案A并找到答案的测试来自己回答问题.不同环境之间存在很多差异,我们无法回答.

  • 我通过循环 100 000 次在 java 上测试了这个,当测试非常简单时,条件分配似乎稍微快一些。 (2认同)

Gre*_*att 5

你测试过这个吗?在 Linux 系统上工作,我将第一个示例放在名为 LoopTestNoIf.java 的文件中,将第二个示例放在名为 LoopTestWithIf.java 的文件中,在每个示例周围包装一个主函数和类,进行编译,然后使用以下 bash 脚本运行:

#!/bin/bash
function run_test {
  iter=0
  while [ $iter -lt 100 ]
  do
    java $1
    let iter=iter+1
  done
}
time run_test LoopTestNoIf
time run_test LoopTestWithIf
Run Code Online (Sandbox Code Playgroud)

结果是:

real    0m10.358s 
user    0m4.349s 
sys     0m1.159s 

real    0m10.339s
user    0m4.299s 
sys     0m1.178s
Run Code Online (Sandbox Code Playgroud)

表明拥有 if 会使我的系统上的速度稍微快一些。


Mat*_*ttC 1

您是否试图找出在总运行时间上对每个循环进行分配是否比对每个循环进行检查并在满足测试条件时仅分配一次更快?

在上面的例子中,我猜测第一个更快。您执行 5 项任务。在后者中,您执行 5 项测试,然后执行一项作业。

但是您需要增加迭代次数并添加一些秒表计时器才能确定。