我正在编写非常耗费处理器的密码学代码(C#),所以我正在寻找任何性能提升,无论多小.我已经在这个问题上听到了双方的意见.
是否有任何性能优势
int smallPrime, spGen;
for (int i = 0; i < numSmallPrimes; i++)
{
smallPrime = smallPrimes[i];
spGen = spHexGen[i];
[...]
}
Run Code Online (Sandbox Code Playgroud)
在这?
for (int i = 0; i < numSmallPrimes; i++)
{
int smallPrime = smallPrimes[i];
int spGen = spHexGen[i];
[...]
}
Run Code Online (Sandbox Code Playgroud)
编译器是否已经这样做了?
我已经看到很多关于是否在for循环范围内部或外部声明变量的问题.这是详细讨论的,例如,这里,这里和这里.答案是绝对没有性能差异(相同的IL),但为了清楚起见,在最严格的范围内声明变量是首选.
我对一个稍微不同的情况感到好奇:
int i;
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (i = 0; i < 10; i++) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
与
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
Run Code Online (Sandbox Code Playgroud)
我希望这两种方法在Release模式下编译为相同的IL.然而,这种情况并非如此.我会给你全部的IL,并指出差异.第一种方法有一个本地:
.locals init (
[0] int32 i
)
Run Code Online (Sandbox Code Playgroud)
而第二个只有两个本地,每个for循环计数器一个:
.locals init (
[0] int32 i,
[1] int32 i
) …Run Code Online (Sandbox Code Playgroud)