Оптимизация компилятора C #
Мне интересно, может ли кто-нибудь объяснить мне, что именно может делать компилятор, чтобы я наблюдал такие экстремальные различия в производительности для простого метода.
public static uint CalculateCheckSum(string str) {
char[] charArray = str.ToCharArray();
uint checkSum = 0;
foreach (char c in charArray) {
checkSum += c;
}
return checkSum % 256;
}
Я работаю с коллегой, проводя тестирование / оптимизацию для приложения обработки сообщений. Выполнение 10 миллионов итераций этой функции с использованием одной и той же строки ввода заняло около 25 секунд в Visual Studio 2012, однако, когда проект был построен с использованием "Оптимизировать код » опция включала тот же код, выполненный за 7 секунд для тех же 10 миллионов итераций.
Мне очень интересно понять, что делает компилятор за кулисами, чтобы мы могли увидеть увеличение производительности более чем в 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 секунды.