Влияние на наследование классов - PullRequest
0 голосов
/ 12 мая 2018

Итак, для многих это может показаться странным вопросом, но вот он:

Допустим, у вас есть абстрактный класс "Object" с абстрактным методом doStuff (), от которого наследуется 10.000 классов.

Затем в другом классе у вас есть словарь «Объект» со 100 случайными объектами типа «Объект». Вы вызываете doStuff () для них.

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

Если это оказывает какое-либо влияние на производительность, существуют ли способы по-разному структурировать код для устранения этой проблемы?

Я чувствую, что действительно обдумываю это.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Количество производных классов может оказать некоторое влияние.

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

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

Для сравнения: .NET (в целом) состоит из примерно девяти тысяч девятисот классов. Приличное по размеру приложение может легко добавить сотни или более, необходимых для получения десяти тысяч - но вы говорите о коллекции, которая может включать в себя что угодно в .NET, плюс что-нибудь в вашем приложении. Мне трудно представить ситуацию, в которой это может иметь смысл.

0 голосов
/ 13 мая 2018

Если вы спрашиваете это из любопытства как гипотетический вопрос, тогда достаточно справедливо.

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

Кроме того, супероптимизированный код обычно гораздо менее читабелен и удобен в обслуживании.

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

0 голосов
/ 12 мая 2018

При вызове doStuff.

заметного влияния на производительность не наблюдается. Во время выполнения тип объекта, на который вы вызываете doStuff, известен , наверняка .Во время компиляции вам понадобится гигантский оператор switch, потому что вы не знаете его тип.CLR видит, что вы пытаетесь вызвать doStuff на Subclass0679, входит в этот класс и вызывает метод.Просто как тот.

Думайте об этом так.ToString() объявлен в Object, а все классы наследуют Object.Когда вы звоните по номеру ToString(), это действительно медленно?Нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...