2016-01-24 5 views
2

Я просто пытаюсь выяснить, почему функции, похоже, работают быстрее после того, как они были вызваны один раз, прежде чем измерять время.C# Функция быстрее измеряет время после предварительного вызова?

Вот пример моего кода измерения:

  float X = 0; 
     FastMath.FireUp(); // Does nothing in this sample 
     Stopwatch watch = new Stopwatch(); 
     watch.Start(); 
     for (int i = 0; i < 5; i++) 
     { 
      X = FastMath.FastSin(i); 
     } 
     watch.Stop(); 
     Console.WriteLine("TIME : " + watch.Elapsed); 

И здесь вы можете увидеть мою называемую функцию:

 public static float FastSin(float val) 
    { 
     int index = 360 - ((int)val % 360); 
     if(index == 360) 
     { 
      return 0; 
     } 
     return -TRIGONOMETRIC_LOOKUPTABLE[index]; 
    } 

Так дело в том, что мои измерения показывает следующий вывод:

ВРЕМЯ: 00: 00: 00.0001196

Позволяет заполнить функцию "FireUp" с:

float x = FastSin(123); 

Теперь измеренное время значительно уменьшилось:

00: 00: 00,0000015

Но все-таки, "FastCos", который не был вызван функцией FireUp, все еще занимает больше времени.

Две другие точки, которые я должен упомянуть:

  • Если я не вызовите функцию "FireUp", увеличивается время снова:

    ВРЕМЯ: 00: 00: 00,0002796

  • Если я воспользуюсь функцией «FireUp»:

    float x = FastSin (123); x = FastCos (123);

    Он просто отлично работает для обеих функций в будущем измерении. Теперь для каждой функции требуется ВРЕМЯ: 00: 00: 00.0000019.

Почему это происходит?

+2

JIT Compilation https://msdn.microsoft.com/en-us/library/ht8ecch6(v=vs.90).aspx, http://www.telerik.com/blogs/understanding-net-just- in-time-compilation – Eser

ответ

3

При компиляции для управляемого кода, компилятор переводит ваш исходный код в Microsoft Intermediate Language (MSIL), который является CPU-независимый набор инструкций, которые могут быть эффективно преобразованы в машинный код.

Введенный код MSIL, скомпилированный (JIT) в код, зависящий от бинарной платформы. CLR компилирует только что используемые paerts кода, тогда он будет компилировать метод FastSin непосредственно перед его вызовом в первый раз.

Среда исполнения предоставляет другой способ компиляции под названием install-time генерация кода. Режим генерации кода времени установки преобразует MSIL в собственный код, как это делает обычный JIT-компилятор, но он преобразует больших единиц кода за раз, сохраняя полученный нативный код для , когда сборка будет загружена и запущена.

Вы можете узнать больше о MSIL и Compiling MSIL to Native Code.

1

Метод как раз вовремя скомпилирован (jit). Вот почему это происходит быстрее после того, как вызывается.

+0

Вы знаете, как отключить этот вид компиляции в visual studio 2015? Я попытался отключить параметры отладки JIT, но все же результаты. – bitQUAKE

+1

Jit-компилятор является частью clr. Вы можете предварительно скомпилировать с ngen. – DeveloperUK

+0

@ Zerrox96 - это обычная практика сначала разогреть методы для тестов производительности и даже разогревать службы для инициализации инфраструктуры для крупных инфраструктур. –

 Смежные вопросы

  • Нет связанных вопросов^_^