Оптимизация компилятора 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 секунды.

Ответы на вопрос(3)

Ваш ответ на вопрос