результат работы у меня одинаковый, т.е не какого повышения производительности не вижу.
Хотя наверное нужно дописать инициализацию поля до обращения к нему. - Как это сделать?
Из Рихтер clr in C# 2.0 (Производительность конструкторов типа)
| Цитата | статические поля должны инициализироваться до обращения к ним, а явно заданный конструктор типа может содержать дополнительный код, который может выполнять определенную видимую работу, поэтому его нужно выполнять в заданное разработчиком время.
|
| Код | // С# отмечает определение типа в метаданных ключевым словом BeforeFieldlnit. internal sealed class BeforeFieldlnit { public static Int32 s_x = 123; } // Так как в этом классе конструктор типа задан явно, // С# не отмечает определение типа в метаданных ключевым словом BeforeFieldlnit. internal sealed class Precise { public static Int32 s_x; static Precise() { s_x = 123; } } public sealed class Program {
static void Main(string[] args) { const Int32 iterations = 1000 * 1000 * 1000; PerfTesti(iterations); PerfTest2(iterations);
} private static void PerfTesti(Int32 iterations) { Stopwatch sw = Stopwatch.StartNew(); for (Int32 x = 0; x < iterations; x++) { // JIT-компилятор создает код вызова конструктора типа BeforeFieldlnit, // чтобы он выполнился до начала цикла. BeforeFieldlnit.s_x = 1; } Console.WriteLine("PerfTesti: {0} BeforeFieldlnit", sw.Elapsed);
sw = Stopwatch.StartNew(); for (Int32 x = 0; x < iterations; x++) { // ЛТ-компилятор создает код вызова конструктора типа Precise, // чтобы тот проверил, нужно ли вызывать конструктор // в каждом цикле. Precise.s_x = 1; } Console.WriteLine("PerfTest1: {0} Precise", sw.Elapsed); } // При ЛТ-компиляции этого метода, конструкторы типов // для классов BeforeFieldlnit и Precise уже завершили работу, // поэтому вызовы этих конструкторов НЕ ВСТРАИВАЮТСЯ // в код метода, из-за чего он исполняется быстрее. private static void PerfTest2(Int32 iterations) { Stopwatch sw = Stopwatch.StartNew(); for (Int32 x = 0; x < iterations; x++) { BeforeFieldlnit.s_x = 1; } Console.WriteLine("PerfTest2: {0} BeforeFieldlnit", sw.Elapsed); sw = Stopwatch.StartNew(); for (Int32 x = 0; x < iterations; x++) { Precise.s_x = 1; }
Console.WriteLine("PerfTest2: {0} Precise", sw.Elapsed); }
}
|
Результат в книге:
| Цитата | PerfTesti: 00:00:02.1997770 BeforeFieldlnit PerfTesti: 00:00:07.6188948 Precise PerfTest2: 00:00:02.0843565 BeforeFieldlnit PerfTest2: 00:00:02.0843732 Precise
|
|