在for循环中存储最后一个有效索引

时间:2013-04-23 19:17:43

标签: for-loop increment

相关问题:Incrementing: x++ vs x += 1

我的代码是这样的:

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

我想知道将lastValidIndex分配给i或增加它是否会更快。我猜测分配会更快,所以计算机不必添加,但我不确定。

3 个答案:

答案 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#中。