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(取决于数据结构和条件规则)