JIT-компилятор лажает?
От: bitferens  
Дата: 19.06.09 07:03
Оценка:
Тема тысячи раз обсуждалась, но тем не менее.
Насколько оптимизирующий JIT-компилятор оптимизирует?
К примеру, весь цивилизованный мир уверяет, что тривиальные свойства инлайнятся, и я до недавнего времени был уверен, что в большинстве случаев это так. Но после странных скачков производительности в проекте решил-таки проверить. Имеется класс с целочисленным свойством и полем:



    class PropertyTest
    {

        public long Field;

        public long Property
        {
            get
            {
                return Field;
            }
            set
            {
                Field = value;
            }
        }
    }


В цикле суммируем числа от 0 до N — 1 сначала через поле, а затем через свойство:



        static void Main(string[] args)
        {
            var test = new PropertyTest();
            
            const long N = 10000000;
            
            var sum = 0L;
            var start = DateTime.Now;

            for (int i = 0; i < N; ++i)
            {
                test.Field = i;
                sum += test.Field;
            }

            var period = DateTime.Now - start;

            Console.WriteLine("Ticks: {0}, Sum: {1}", period.Ticks, sum);

            sum = 0;
            start = DateTime.Now;

            for (int i = 0; i < N; ++i)
            {
                test.Property = i;
                sum += test.Property;
            }

            period = DateTime.Now - start;

            Console.WriteLine("Ticks: {0}, Sum: {1}", period.Ticks, sum);
            Console.ReadKey(true);
        }


На моей машине (C2D 2.5GHz/Vista/.NET 3.5 SP1) выигрыш при использовании поля получается чуть ли не в 5 раз.

Вопрос: как понимать результаты подобной оптимизации?
c# jit оптимизация inline
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.