相关问题:递增:x++ vs x += 1
我有这样的代码:
int lastValidIndex = -1;
for(int i = 0; i < limit; i++){
if (condition)
lastValidIndex++;
else
break;
}
而且我想知道分配或增加它是否会lastValidIndex
更快i
。我猜只是分配会更快,因此计算机不必添加,但我不确定。
相关问题:递增:x++ vs x += 1
我有这样的代码:
int lastValidIndex = -1;
for(int i = 0; i < limit; i++){
if (condition)
lastValidIndex++;
else
break;
}
而且我想知道分配或增加它是否会lastValidIndex
更快i
。我猜只是分配会更快,因此计算机不必添加,但我不确定。
这可能在某种程度上取决于您的语言。由于您没有指定,我将假设宏汇编程序(又名 C)。
假设没有太多其他逻辑,两个值都将被分配为寄存器变量。
这意味着增量或分配将是一个时钟周期,或者在现代处理器上约为 1/2000000 秒。
根据您的数组的大小,可能 ...ahem... 通过使用此优化可以节省一些时间:
int lastValidIndex = -1;
while( condition ) {
lastValidIndex++;
}
但我的猜测是,无论您在计算最后一个有效索引时可能节省多少,都与您的条件检查相形见绌,当然,无论您花费多少大脑周期试图弄清楚您是否真的节省了 1/2000 秒,都相形见绌。
它出现在 C# 的反汇编中,第一个使用“inc”这是一个操作,而分配它由两个“mov”操作组成。
使用此代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
namespace IncrementTest {
class Program {
static void Main(string[] args) {
Stopwatch watch = new Stopwatch();
long totalMethod1 = 0;
for (int j = 0; j < 100; j++) {
int lastValidIndex = -1;
watch.Reset();
watch.Start();
for (int i = 0; i < 100000000; i++) {
lastValidIndex++;
}
watch.Stop();
totalMethod1 += watch.ElapsedMilliseconds;
}
Console.WriteLine("Method 1 took an average of " + (double)totalMethod1 / 100 + "ms");
long totalMethod2 = 0;
for (int j = 0; j < 100; j++) {
int lastValidIndex = -1;
watch.Reset();
watch.Start();
for (int i = 0; i < 100000000; i++) {
lastValidIndex = i;
}
watch.Stop();
totalMethod2 += watch.ElapsedMilliseconds;
}
watch.Stop();
Console.WriteLine("Method 2 took an average of " + (double)totalMethod2 / 100 + "ms");
Console.ReadLine();
}
}
}
我出人意料地得到了这个输出:
Method 1 took an average of 381.51ms
Method 2 took an average of 354.76ms
因此,如果您必须使用两个不同的变量,那么至少在 C# 中分配似乎更快。
int lastValidIndex = -1;
while(lastValidIndex < limit - 1 && condition) ++lastValidIndex;
// use lastValidIndex here ...