我想知道是否有人能够向我解释编译器到底在做什么,以致于我观察到一个简单方法的性能有如此巨大的差异。
public static uint CalculateCheckSum(string str) {
char[] charArray = str.ToCharArray();
uint checkSum = 0;
foreach (char c in charArray) {
checkSum += c;
}
return checkSum % 256;
}
我正在与一位同事合作对消息处理应用程序进行基准测试/优化。在 Visual Studio 2012 中,对于相同的输入字符串,使用相同的函数执行 1000 万次迭代大约需要 25 秒,但是当打开“优化代码”选项构建项目时,相同代码执行相同的 1000 万次迭代仅需 7 秒。
我非常想了解编译器在幕后做了些什么,以使我们能够看到这样一个看似无辜的代码块的性能提高超过 3 倍。
按要求,这里是一个完整的控制台应用程序,演示了我所看到的情况。
class Program
{
public static uint CalculateCheckSum(string str)
{
char[] charArray = str.ToCharArray();
uint checkSum = 0;
foreach (char c in charArray)
{
checkSum += c;
}
return checkSum % 256;
}
static void Main(string[] args)
{
string stringToCount = "8=FIX.4.29=15135=D49=SFS56=TOMW34=11752=20101201-03:03:03.2321=DEMO=DG00121=155=IBM54=138=10040=160=20101201-03:03:03.23244=10.059=0100=ARCA10=246";
Stopwatch stopwatch = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
CalculateCheckSum(stringToCount);
}
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed);
}
}
在关闭优化的调试模式下运行,我看到需要13秒,启用优化后只需2秒。
在关闭优化的发布模式下运行需要3.1秒,启用优化后只需2.3秒。
ToCharArray
是多余的... 因此,编译器可能正在执行类似于for(int i = 0; i < str.length; i ++) ...
的操作。 - Alex