首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >循环时哪一个开销更大;赋值语句还是if语句?

循环时哪一个开销更大;赋值语句还是if语句?
EN

Stack Overflow用户
提问于 2010-10-28 21:41:04
回答 5查看 11.3K关注 0票数 25

考虑以下两个场景:

代码语言:javascript
复制
boolean b = false;
int i = 0;
while(i++ < 5) {
    b = true;
}

代码语言:javascript
复制
boolean b = false;
int i = 0;
while(i++ < 5) {
    if(!b) {
        b = true;
    }
}

哪一种做法更“昂贵”?如果答案取决于使用的语言/编译器,请提供。我的主要编程语言是Java。

请不要问我为什么要这样做..它们只是指出相关问题的赤裸裸的例子:一个变量应该一遍又一遍地在循环中设置相同的值,还是应该在每个包含需要更改的值的循环上对其进行测试?

EN

回答 5

Stack Overflow用户

发布于 2010-10-28 22:17:07

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

代码语言:javascript
复制
#!/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

结果是:

代码语言:javascript
复制
real    0m10.358s 
user    0m4.349s 
sys     0m1.159s 

real    0m10.339s
user    0m4.299s 
sys     0m1.178s

显示了使用if会让我的系统运行得更快。

票数 5
EN

Stack Overflow用户

发布于 2010-10-28 21:48:50

您是否正在尝试找出执行每个循环的赋值是否比执行check each循环并仅在满足测试条件时赋值一次在总运行时间上更快?

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

但你需要增加迭代次数,并加上一些秒表计时器才能确定。

票数 1
EN

Stack Overflow用户

发布于 2018-07-15 03:30:21

实际上,这是我对…感兴趣的问题(我希望我能在某个地方找到答案,以避免自己的测试。好吧,我没有…)

为了确保你的(我的)测试是有效的,你(I)必须进行足够的迭代来获得足够的数据。每次迭代必须足够“长”(我是指时间尺度),以显示真正的差异。我发现即使是十亿次迭代也不足以适应足够长的…时间间隔所以我写了这个测试:

代码语言:javascript
复制
for (int k = 0; k < 1000; ++k)
{
    {
        long stopwatch = System.nanoTime();

        boolean b = false;
        int i = 0, j = 0;
        while (i++ < 1000000)
            while (j++ < 1000000)
            {
                int a = i * j; // to slow down a bit
                b = true;
                a /= 2; // to slow down a bit more
            }

        long time = System.nanoTime() - stopwatch;
        System.out.println("\\tasgn\t" + time);
    }
    {
        long stopwatch = System.nanoTime();

        boolean b = false;
        int i = 0, j = 0;
        while (i++ < 1000000)
            while (j++ < 1000000)
            {
                int a = i * j; // the same thing as above
                if (!b)
                {
                    b = true;
                }
                a /= 2;
            }

        long time = System.nanoTime() - stopwatch;
        System.out.println("\\tif\t" + time);
    }
}

我运行了三次测试,将数据存储在Excel中,然后交换了第一个(‘asgn’)和第二个(‘if’)案例,并再次运行了三次…结果呢?四次“赢”了“if”的情况,两次“asgn”似乎是更好的情况。这显示了执行可能有多敏感。但总的来说,我希望这也证明了“如果”的情况是更好的选择。

谢谢,不管怎样,…

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4043455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档