Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Производительность вызова get/set 
:(
    Опции темы
SANCHO123
Дата 4.5.2012, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 25.5.2008

Репутация: нет
Всего: нет



Добрый день!

Есть класс:

Код

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 раз быстрее, но потерял нужную функциональность.












PM MAIL   Вверх
infarch
Дата 7.5.2012, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 13.3.2009

Репутация: 1
Всего: 1



Немного не по теме, но... почему так: "if (Rotate == true)" , не проще ли "if (Rotate)" ?
PM MAIL   Вверх
Экскалупатор
Дата 7.5.2012, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 11
Всего: 24



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

дело не в проверке, а в том что достук к переменной происходит быстрее, чем к свойству. фактически каждое свойство в MSIL выглядят как два метода (аля get и set), так что обращаясь к свойству на самом деле идет вызов метода, что выполняется дольше.
PM MAIL ICQ   Вверх
Дрон
Дата 15.5.2012, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 24
Всего: 92



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

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


--------------------
Да. Именно так.
PM   Вверх
eugene123
Дата 23.5.2012, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 1.8.2011

Репутация: нет
Всего: нет



код
Код

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
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0701 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.