Мне интересно, может ли кто-нибудь объяснить мне, что именно компилятор может сделать для меня, чтобы наблюдать такие экстремальные различия в производительности для простого метода.
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 секунды.
Запуск в режиме Release с оптимизацией с 3,1 секунды и на 2,3 секунды.