Какая эффективность снижается при понижении частоты?

Просто пытаюсь разобраться в Generics, прочитав эта поучительная статья Жюваля Лоуи

Перефразирование .. Когда вы определяете определение универсального класса, оно компилируется в IL.

  • Для типов значений, как только вы запрашиваете конкретный тип значения, он заменяет T вашим конкретным типом значения, чтобы получить IL для этой конкретной конфигурации, например. MyList<int>Преимущество: Отсутствие штрафов за бокс и распаковку.
  • Все хорошо ... для ссылочных типов компилятор заменяет все экземпляры T в вашем определении на Object и создает IL, который используется для всех типов ссылок. Однако экземпляры выделяются на основе фактического запрошенного типа ссылки, например. MyList<String>

Теперь до дженериков мы могли бы написать методы, принимающие параметры Object. Generics заявляет об улучшении производительности на 100%, потому что 'это позволяет избежать потери производительности, которую вы понесете, когда вы понижаете тип объекта до вашего конкретного типа, когда вы хотите его использовать '

 // assume GetItem returns an Object
 string sMyPreciousString = (string) obList.GetItem(); 

Что это за удар по производительности при переходе от объекта к конкретному ссылочному типу? Также кажется, что преобразование в Object (даже Generics сделало бы это) не снижает производительности ... почему?

Как создавать пользовательские общие типы в Python (50/100 дней Python)
Как создавать пользовательские общие типы в Python (50/100 дней Python)
Помимо встроенных типов, модуль типизации в Python предоставляет возможность определения общих типов, что позволяет вам определять типы, которые могут...
5
0
1 973
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Приведение к объекту не требует проверки времени выполнения - оно всегда будет работать и, по сути, не требует никаких действий.

Для понижающего преобразования требуется проверка времени выполнения, чтобы убедиться, что вы, например, не преобразуете Stream в String. Это довольно небольшое наказание, и маловероятно, что оно станет узким местом, но его предотвращение - лишь одно дополнительное преимущество для дженериков.

Просто, когда вы это знаете ... простой IL instr позволяет повысить производительность на 100% :)

Gishu 20.11.2008 21:08

Падение производительности связано с необходимостью проверки типа во время выполнения. Если B является подклассом A, то, когда вы преобразуете B в A, вы знаете во время компиляции, что это будет безопасно, поскольку все B - это As. Следовательно, вам не нужно создавать какой-либо код времени выполнения для проверки типа.

Однако, когда вы преобразуете A в B, вы не знаете во время компиляции, является ли A на самом деле B или нет. Это может быть просто A, это может быть тип C, другой подтип A. Следовательно, вам необходимо сгенерировать код времени выполнения, который будет проверять, действительно ли объект является B, и генерировать исключение, если это не так.

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

Чтение генерируемого IL (это статья упоминает) ... ага - isinst.

Если бы вы не понижали цену, вам бы не пришлось звонить isinst.

Другие вопросы по теме