Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Конструктор типа


Автор: DenWPF 16.4.2011, 13:35
результат работы у меня одинаковый, т.е не какого повышения производительности не вижу.

Хотя наверное нужно дописать инициализацию поля до обращения к нему. - Как это сделать?

Из Рихтер 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 


Автор: Rohoss 16.4.2011, 13:49
DenWPF, ты бы написал что тебе нужно  smile 

Автор: DenWPF 16.4.2011, 13:59
ну что бы производительность улучшилась как говориться в книге...

Автор: Voyager 16.4.2011, 18:00
Улучшилось по сравнению с чем?
На практике в большинстве случаев ощутимого результата производительности вы не заметите.

Автор: DenWPF 16.4.2011, 18:12
PerfTest2, должен по теории и по данным из книги работать быстрей, у меня такого нет. 
 

Автор: Voyager 17.4.2011, 20:12
У меня PerfTesti видится абсолютно одинаковым с PerfTest2, а у вас как?

Автор: DenWPF 17.4.2011, 20:22
Цитата(Voyager @ 17.4.2011,  20:12)
У меня PerfTesti видится абсолютно одинаковым с PerfTest2, а у вас как?

вот, я же об этом...
в книге написано что нужно в начале инициализировать перед вызовом...или что то в этом роде...

я же говорю прямо как в книге, вот и спрашиваю что не так.

Автор: Voyager 18.4.2011, 11:22
Приложите информацию из книги (скриншот, ссылку на страницу и т.д., оригинал), а то разговор непредметным получается.

Автор: DenWPF 18.4.2011, 11:28
Я уже писал.  Rihter clr in C# 2.0 page 182

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)