0

相关问题:递增:x++ vs x += 1

我有这样的代码:

int lastValidIndex = -1;
for(int i = 0; i < limit; i++){
    if (condition)
        lastValidIndex++;
    else
        break;
}

而且我想知道分配或增加它是否会lastValidIndex更快i。我猜只是分配会更快,因此计算机不必添加,但我不确定。

4

3 回答 3

1

这可能在某种程度上取决于您的语言。由于您没有指定,我将假设宏汇编程序(又名 C)。

假设没有太多其他逻辑,两个值都将被分配为寄存器变量。

这意味着增量或分配将是一个时钟周期,或者在现代处理器上约为 1/2000000 秒。

根据您的数组的大小,可能 ...ahem... 通过使用此优化可以节省一些时间:

int lastValidIndex = -1;
while( condition ) {
    lastValidIndex++;
}

但我的猜测是,无论您在计算最后一个有效索引时可能节省多少,都与您的条件检查相形见绌,当然,无论您花费多少大脑周期试图弄清楚您是否真的节省了 1/2000 秒,都相形见绌。

于 2013-04-23T19:24:55.370 回答
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# 中分配似乎更快。

于 2013-04-23T19:53:10.203 回答
0
int lastValidIndex = -1;
while(lastValidIndex < limit - 1 && condition) ++lastValidIndex;
// use lastValidIndex here ...
于 2013-04-23T19:26:07.937 回答