Разминка при вызове методов в C # - PullRequest
10 голосов
/ 15 декабря 2010

Я только что натолкнулся на этот пост , в котором говорится об измерении времени. Я помню (надеюсь, я не помню), это нечестная конкуренция, если этот метод никогда не вызывался раньше. То есть:

// At the beginning of the application
MyClass instance = new MyClass();
instance.MyMethod();
instance.MyMethod();  // Faster than the first call, because now it's warmed up.

У нас действительно есть такая теория разогрева в C #? Если да, то почему (что будет делать CLR при прогреве)? И все ли одинаково, если этот метод является расширением (статическим)?

Ответы [ 4 ]

7 голосов
/ 15 декабря 2010

Если при «разогреве» вы ссылаетесь на JIT'ing, тогда да - если метод никогда не вызывался, он еще не был скомпилирован, поэтому при первом запуске он может быть медленнее.Также см. .NET CLR JIT каждый раз компилирует каждый метод?

6 голосов
/ 15 декабря 2010

Это происходит из-за своевременной компиляции (JIT). Если вы хотите повысить производительность и избежать этого эффекта, вам может помочь Native Image Generator (Ngen.exe).

4 голосов
/ 15 декабря 2010

То, о чём здесь говорят, это сборник точно в срок .Код, который вы создаете в .NET, хранится на промежуточном языке, который не зависит от платформы.Когда вы запускаете приложение, части кода CIL компилируются в инструкции для конкретной платформы, что занимает немного времени в первый раз.Затем он кэшируется, поэтому при следующем вызове метода у вас не будет этой потери времени.

Если вы действительно этого хотите, вы можете предварительно скомпилировать версию для конкретной платформы.

3 голосов
/ 15 декабря 2010

Это нужно скомпилировать, и поэтому первый вызов длиннее.

С Компиляция MSIL в собственный код :

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

...