C #Улучшения джиттера в будущих версиях фреймворка

Я заметил, что джиттер C #производит значительно более медленный код, чем компилятор C++, даже если не используются конструкции «управляемых служебных данных» (, такие как массивы с проверенной индексацией ).

Для количественной оценки я замерил время следующего простого цикла:

public static int count = 1000000000;
public static int Main()
{
    int j = 0;
    for (int i = 0; i < count; ++i)
    {
        j += (i % 2 == 0) ? ((i + 7) >> 3) : (i * 7);
    }
    return j;
}

Этот цикл занимает 3,88 с для выполнения (, скомпилированного с /o ). Эквивалентный цикл, скомпилированный с помощью VC 2010 (-O2 ), занимает 2,95 с.

Чтобы убедиться, что неполноценный код был действительно сгенерирован, я сравнил машинные коды :, создал листинг (/FAs )из компилятора VC и прикрепил отладчик к программе C #(после завершения цикла ). ].

Действительно, версия C++ использует некоторые хитрые приемы. Например, чтобы избежать дорогостоящего умножения на 7, существует отдельный регистр, который увеличивается на 7 при каждом счете цикла. Версия C #выполняет умножение (imul )каждый раз. Есть и другие отличия.

Я понимаю, что джиттер C #имеет гораздо меньше времени для компиляции кода во время выполнения, чем VC во время сборки. Но напр. Джиттер Java динамически оптимизирует часто используемые методы. C #, похоже, этого не делает.

Мой вопрос: :есть ли планы по улучшению джиттера C #в будущих версиях фреймворка?

7
задан kaalus 16 August 2012 в 14:39
поделиться