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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Производительность оператора Is, В сравнении с оператором сравнения :) 
V
    Опции темы
amarenkov
Дата 25.6.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



Добрый день.

Есть разные классы от одного предка (SomeClass). Внутри функции необходимо определить, какой из этих классов был передан через параметр типа SomeClass.

Вопрос в следующем - что будет производительнее: проверять переданный object при помощи оператора is на соответствие всем этим классам по-очереди, или создать у класса SomeClass поле перечеслимого типа (которое содержало бы "идентификаторы" всех дочерних классов) и проверить это поле через switch?

Вопрос можно переформулировать еще проще - что производительнее: an_object is SomeClass2 или an_object.OurType == OurTypes.SomeClass2?

Заранее спасибо smile.
PM MAIL ICQ   Вверх
DVariuS
Дата 25.6.2009, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



amarenkov, быстрее будет конечно-же 
Код

an_object.OurType == OurTypes.SomeClass2

но правильнее все-таки 
Код

an_object is SomeClass2

т.к. более наглядно отображает смысл.
P.S. А еще лучше приведи фрагмент кода, где ты хочешь использовать такую проверку.

Это сообщение отредактировал(а) DVariuS - 25.6.2009, 13:45
PM MAIL   Вверх
archeg
Дата 25.6.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Это зависит от архитектуры и зачем оно нужно. Например если у тя много класов, то для каждого создавать перечислимое поле - геморно. Тем более информация будет повторяться - уже есть тип класа, то зачем же его еще прописывать в поле?
Но перечисляемые поля имеют свой "+". Где-то можно добавить какую-то гибкость, не усложняя при этом иерархию:
Код

class Number : Symbol
{
    public int Value {get; set;}
    
    public SymbolClassification GetClassification()
    {
         return Value > 0 ? SymbolClassification.PositiveNumber : SymbolClassification.NegetiveOrNullNumber;
    }
}


Добавлено @ 14:08
И вообще помойму is будет быстрее ==. Ток вопрос на самом деле не в скорости, а удобстве. Я надеюсь)

Это сообщение отредактировал(а) archeg - 25.6.2009, 14:09


--------------------
ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru)

Дядька всегда можно спросить в аське, если не задалбывать - не откажет smile
И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои  ;)
PM MAIL ICQ Jabber   Вверх
PashaPash
Дата 25.6.2009, 15:08 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



amarenkov, быстрее - и правильнее - не писать switch или цепочку if-else по типам, а вынести типозависымый код в виртуальные функции. 
Это классический Switch Code Smell, вот пример с картинкой: https://elearning.industriallogic.com/gh/su...evLanguage=Java


--------------------
PM MAIL WWW   Вверх
amarenkov
Дата 26.6.2009, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



Цитата(PashaPash @  25.6.2009,  15:08 Найти цитируемый пост)
... а вынести типозависымый код в виртуальные функции. 

Не получится smile. 

Задача (если сильно упростить) сводится к работе с графическими объектами. Есть базовый Figure, и есть наследники: Point, Line, Polygon и т.п.

И есть функция отрисовки. Вне этих классов. Вносить эту функцию в них я категорически не хочу, т.к. это было бы некорректно с точки зрения модели smile.

Вот, собственно, и все. В функцию отрисовки передается Figure. Функция должна узнать, что это за фигура такая и отрисовать ее.
PM MAIL ICQ   Вверх
amarenkov
Дата 26.6.2009, 06:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 183
Регистрация: 21.2.2008
Где: Воронеж

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



В принципе, вопрос снимается.

Сделал простой тест, и на 1 000 000 объектов проверка через перечислимый тип дает 156 250 тиков, а через is - 312 500. 

Жаль smile. Хотелось сделать красивее, через is, но быстрее через перечислимый тип.
PM MAIL ICQ   Вверх
KelTron
Дата 26.6.2009, 07:18 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хоть это и банально, но
"Преждевременная оптимизация - корень всех зол"

Вот если после написания прога будет тормозить, и профайлер покажет, что данная проверка это слабое место по производительности, тогда и оптимизируй. Хотя многие опытные люди говорят, что обычно слабое место оказывается совсем не там где предполагали разработчики, а от оптимизации второстепенных(в плане производительности) кусков кода толку будет мало и читабельность программы ухудшится.




--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Partizan
Дата 26.6.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



Цитата(amarenkov @ 26.6.2009,  06:35)
Цитата(PashaPash @  25.6.2009,  15:08 Найти цитируемый пост)
... а вынести типозависымый код в виртуальные функции. 

Не получится smile. 

Задача (если сильно упростить) сводится к работе с графическими объектами. Есть базовый Figure, и есть наследники: Point, Line, Polygon и т.п.

И есть функция отрисовки. Вне этих классов. Вносить эту функцию в них я категорически не хочу, т.к. это было бы некорректно с точки зрения модели smile.

Вот, собственно, и все. В функцию отрисовки передается Figure. Функция должна узнать, что это за фигура такая и отрисовать ее.

amarenkov,

Что мешает в каждый из классов добавить виртуальный метод Render, когда каждый элемент сам знает как себя нарисовать?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
PashaPash
Дата 26.6.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

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



Цитата(amarenkov @  26.6.2009,  06:35 Найти цитируемый пост)

И есть функция отрисовки. Вне этих классов. Вносить эту функцию в них я категорически не хочу, т.к. это было бы некорректно с точки зрения модели

Это вообще-то корректно с точки зрения модели, более того - пример с фигурами и функцией отрисовки есть практически в любой книжке по ООП, в главе про полиморфизм. Настолько корректно, что пример даже есть в MSDN, в топике Полиморфизм (руководство по программированию в C#). Figure по ненашему Shape, кстати.
Цитата(amarenkov @  26.6.2009,  06:54 Найти цитируемый пост)

Сделал простой тест, и на 1 000 000 объектов проверка через перечислимый тип дает 156 250 тиков, а через is - 312 500. 
Жаль smile. Хотелось сделать красивее, через is, но быстрее через перечислимый тип. 

А если включить саму отрисовку, то результат будет 300 и 301. 1 тик стоит жертвы. 



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


Опытный
**


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

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



не хочешь в классе делать (например, если класс этот представляет из себя нечто вроде DTO) - вынеси в стратегию
только тогда придётся параллельно вести две иерархии, что само по себе не очень удобно, но порой оправдано
Код

    abstract class Figure
    {
        private readonly IRenderStrategy strategy;

        protected Figure(IRenderStrategy strategy)
        {
            this.strategy = strategy;
        }

        public void Render()
        {
            strategy.Render(this);
        }
    }

    interface IRenderStrategy
    {
        void Render(Figure figure);
    }

    class Square : Figure
    {
        public Square() : base(new SquareRenderStrategy())
        {
        }
    }

    class SquareRenderStrategy : IRenderStrategy
    {
        public void Render(Figure figure)
        {
            // render actions
        }
    }


Это сообщение отредактировал(а) mihryak - 26.6.2009, 11:27
PM MAIL ICQ   Вверх
Partizan
Дата 26.6.2009, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



mihryak, сорри...не очень ясно с какой целью Figure ака Shape в метод Render передавать надобно?


а то получается какая-то циклическая зависимость... Figure содержит IRenderStrategy...а потом в Render этого интерфейса тоже надо передать Figure... просто сугубо интересно - зачем?


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
mihryak
Дата 26.6.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хм, это вполне обычный ход

конкретная фигура имеет собственную стратегию отрисовки, а стратегия общая для всех фигур определённого класса
это может позволить, например, держать один инстанс стратегии на все её фигуры, позволяет сделать её stateless
PM MAIL ICQ   Вверх
Partizan
Дата 26.6.2009, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

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



mihryak, ok, идея ясна  smile 


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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