相关问题:Incrementing: x++ vs x += 1
我的代码是这样的:
int lastValidIndex = -1;
for(int i = 0; i < limit; i++){
if (condition)
lastValidIndex++;
else
break;
}
我想知道将lastValidIndex
分配给i
或增加它是否会更快。我猜测分配会更快,所以计算机不必添加,但我不确定。
答案 0 :(得分:1)
这可能在某种程度上取决于您的语言。由于你没有指定,我将假设宏汇编程序(又名C)。
假设没有太多其他逻辑,两个值都将被分配为寄存器变量。
这意味着增量或赋值将是一个时钟周期,或者在现代处理器上约为1/2000000秒。
根据数组的大小,可能...哼...通过使用此优化节省一些时间:
int lastValidIndex = -1;
while( condition ) {
lastValidIndex++;
}
但是我的猜测是,无论你在计算最后一个有效指数时可能节省多少,你的状况检查就会相形见绌,当然,无论你花在哪个脑循环上,你都会想知道你是否真的节省了1/2000秒。
答案 1 :(得分:0)
int lastValidIndex = -1;
while(lastValidIndex < limit - 1 && condition) ++lastValidIndex;
// use lastValidIndex here ...
答案 2 :(得分:0)
在反汇编中出现在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#中。