2010-04-15 3 views
2

Если у меня есть класс с некоторым элементом значения, который я хочу хранить независимо от типа, я бы подумал, что тип объекта будет лучшим. Допустим, что объект реалистично может быть одним из трех типов: string, int, customeClass. Было бы лучше сохранить дополнительный член перечисления класса с тем, какой тип хранится в значении? Или является исполнениемСкорость «if (object is type)» в C#

if(object is string){...} 
else if(object is int){...} 
else if(object is customeClass){...} 

достаточно быстро, что не стоит хранить дополнительную информацию?

+2

В качестве примечания стороны убедитесь, что ваш класс структурирован и задокументирован, чтобы было ясно, что значение может быть только строка, int или customeClass. – StriplingWarrior

+0

Сохранение типа отдельно в перечислении может быть опасным. Вы должны быть очень осторожны, чтобы это всегда было правильно. Если значение перечислимого типа вышло из синхронизации и не соответствовало типу объекта, и вы попытались вызвать метод класса, ваша программа завершится с ошибкой.Использование «is» было бы более надежным. – mbmcavoy

ответ

4

Не следует делать преждевременную оптимизацию перед измерением и доказательством того, что оператор is является локальным узким местом по пути горячего кода. Поддержание перечня альтернативного подхода приведет к развитию налогов в течение длительного времени.

+0

Выбирайте это больше для последнего предложения, так как многие ответы на игру дают то же предупреждение о преждевременной оптимизации. Благодаря! – mphair

2

Этот код будет выполняться так же быстро, как и приведение (другими словами, он будет очень быстрым, так как это одна инструкция IL). Получение значения перечисления из свойства включает в себя гораздо больше работы (элементы должны быть вытолкнуты и вытащены из стека и должны быть вызваны методы), что сделает его намного медленнее, чем использование is.

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

1

Это будет достаточно быстро. Хранение каких-либо дополнительных данных было бы незавершенным, так как вам пришлось бы искать свойства экземпляра класса, чтобы получить тот тип, который вы сохранили, если вы это сделали.

1

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

4

Со всем уважением ... Я думаю, что это называется premature optimization. Я бы не стал беспокоиться о скорости оператора If, даже если это цикл из 10k + итераций.

3

Производительность теста IS в .NET редко связана с производительностью - в худшем случае результатом является False, а объект имеет глубокую иерархию наследования. IS придется выполнять несколько поисков, идущих вверх по цепочке наследования объекта.

Если ваши объекты не имеют глубокого (100+) наследования, разница в производительности будет незначительной.

Наибольшая разница между тестированием наследования и тестированием перечисления заключается в том, что вы можете протестировать перечисление на несколько значений в инструкции switch. Для тестов IS всегда требуется цепочка операторов if. Чем больше (> 10?) Количество элементов для тестирования, тем выше преимущество производительности операторов switch над операторами if.

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