Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Производительность вызова get/set


Автор: SANCHO123 4.5.2012, 15:06
Добрый день!

Есть класс:

Код

class Detail
    {
        public int X;
        public int Y;
        private int _L;
        private int _W;
        public int Sheet;
        public bool Rotate;

        public int L
        {
            get { if (Rotate == true) { return _W; } else { return _L; } }
            set { _L = value; }
        }
        public int W
        {
            get { if (Rotate == true) { return _L; } else { return _W; } }
            set { _W = value; }
        }
    }



Так вот вызовы Detail.get_W() и Detail.get_L()  занимают около 40% времени выполнения функции (по данным анализа производительности VS 2010).
Почему? Разве проверка условия такая тяжелая операция? 

В функции есть множество операций сортировки и создания больших массивов и они занимают меньше времени. 

Удалил get/set. Сделал так:
Код

public int L;
public int W;


Функция стала выполняться в 5 раз быстрее, но потерял нужную функциональность.












Автор: infarch 7.5.2012, 11:48
Немного не по теме, но... почему так: "if (Rotate == true)" , не проще ли "if (Rotate)" ?

Автор: Экскалупатор 7.5.2012, 21:58
Цитата(SANCHO123 @  4.5.2012,  14:06 Найти цитируемый пост)
Функция стала выполняться в 5 раз быстрее, но потерял нужную функциональность.

дело не в проверке, а в том что достук к переменной происходит быстрее, чем к свойству. фактически каждое свойство в MSIL выглядят как два метода (аля get и set), так что обращаясь к свойству на самом деле идет вызов метода, что выполняется дольше.

Автор: Дрон 15.5.2012, 09:54
Я не сильно в курсе как происходит анализ производительности в VS 2010, но есть предположение, что проблема может быть в нём. 
Грубо говоря, если метод или свойство очень простые, то время, затрачиваемое на замер производительности может оказаться даже больше, чем время выполнения полезного кода. Для доступа к переменным в то же время никаких замеров не происходит.
Это распространённая проблема в профайлерах, поэтому такие простые методы обычно исключаются из анализа. Но я могу быть не прав.

Вообще быстродействие было бы хорошо сравнить без профайлера и в режиме Release. Там тоже в 5 раз разница?

Автор: eugene123 23.5.2012, 14:48
код
Код

public int L
        {
            get { if (Rotate == true) { return _W; } else { return _L; } }
            set { _L = value; }
        }


можно заменить 
Код

public int L
        {
            get { return Rotate ? _W : _L; }
            set { _L = value; }
        }


и сравнить

а вообще, как заметил Дрон, в таких случаях лучше не использовать профайлер, а попробовать, например, обойтись классом Stopwatch

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