Я заметил, что джиттер 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 #в будущих версиях фреймворка?