考虑以下两个场景:
boolean b = false;
int i = 0;
while(i++ < 5) {
b = true;
}
或
boolean b = false;
int i = 0;
while(i++ < 5) {
if(!b) {
b = true;
}
}
哪一种做法更“昂贵”?如果答案取决于使用的语言/编译器,请提供。我的主要编程语言是Java。
请不要问我为什么要这样做..它们只是指出相关问题的赤裸裸的例子:一个变量应该一遍又一遍地在循环中设置相同的值,还是应该在每个包含需要更改的值的循环上对其进行测试?
发布于 2010-10-28 22:17:07
你测试过这个吗?在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
结果是:
real 0m10.358s
user 0m4.349s
sys 0m1.159s
real 0m10.339s
user 0m4.299s
sys 0m1.178s
显示了使用if会让我的系统运行得更快。
发布于 2010-10-28 21:48:50
您是否正在尝试找出执行每个循环的赋值是否比执行check each循环并仅在满足测试条件时赋值一次在总运行时间上更快?
在上面的例子中,我猜第一个更快。你要执行5项任务。在后者中,您执行5次测试,然后执行一次赋值。
但你需要增加迭代次数,并加上一些秒表计时器才能确定。
发布于 2018-07-15 03:30:21
实际上,这是我对…感兴趣的问题(我希望我能在某个地方找到答案,以避免自己的测试。好吧,我没有…)
为了确保你的(我的)测试是有效的,你(I)必须进行足够的迭代来获得足够的数据。每次迭代必须足够“长”(我是指时间尺度),以显示真正的差异。我发现即使是十亿次迭代也不足以适应足够长的…时间间隔所以我写了这个测试:
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”似乎是更好的情况。这显示了执行可能有多敏感。但总的来说,我希望这也证明了“如果”的情况是更好的选择。
谢谢,不管怎样,…
https://stackoverflow.com/questions/4043455
复制相似问题