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

For loop 在for循环中存储最后一个有效索引,for-loop,increment,For Loop,Increment,相关问题: 我有这样的代码: int lastValidIndex = -1; for(int i = 0; i < limit; i++){ if (condition) lastValidIndex++; else break; } int lastValidIndex=-1; 对于(int i=0;i

相关问题:

我有这样的代码:

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

我想知道如果将
lastValidIndex
分配给
I
或者增加它,是否会更快。我猜只分配会更快,这样计算机就不必添加,但我不确定。

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

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

这意味着增量或赋值都是一个时钟周期,或者在现代处理器上大约是1/2000000秒

int lastValidIndex = -1;
while(lastValidIndex < limit - 1 && condition) ++lastValidIndex;
// use lastValidIndex here ...
根据阵列的大小,可能…嗯哼。。。使用此优化可节省一些时间:

int lastValidIndex = -1;
while( condition ) {
    lastValidIndex++;
}
但我的猜测是,无论你在计算最后一个有效索引时节省了多少钱,与你的状况检查相比都相形见绌,当然也与你花在试图找出你是否真的节省了1/2000秒的大脑周期相比相形见绌。

int lastValidIndex=-1;
int lastValidIndex = -1;
while(lastValidIndex < limit - 1 && condition) ++lastValidIndex;
// use lastValidIndex here ...
而(lastValidIndex
它出现在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();

        }
    }
}

因此,如果你必须使用两个不同的变量,那么只分配似乎更快,至少在C#中是这样。

编程语言=?我使用的是C#,但这个问题在一般意义上与相关的链接问题类似。这是过早的优化。你可以尝试测量它,但可能与优化的代码相同-编译器可以证明
i==lastValidIndex
,因此它可能会消除这些变量中的一个。是的,我知道我在外部循环而不是内部循环上有
j
,但是使用
j
比将所有
i
s替换为
j
s花费的时间要少。您可能还想添加一个检查,查看
lastValidIndex
是否在限制范围内,或者您是否假设这是
条件的一部分,但是YMMV(取决于数据结构和条件规则)