Comments 11
Спасибо за отличный пост! Очень интересная информация. Есть несколько вопросов:
  • Вы пробовали найти в исходниках нового CoreCLR непосредственный код методов, которые отвечают за описанную вам логику?
  • В посте вы описываете работу JIT-x86. Есть ли какие-нибудь принципиальные отличия в JIT-x64?
  • Есть ли отличия между старым JIT и новым RyuJIT в отношении описанных вами вещей?
спасибо :)

  • Для Virtual stub dispatch — virtualcallstub.h
  • x64 для интерфейсов кэширует либо сразу, либо линейный поиск. плана как для x86, увы, нет. MethodDesc для generic-методов передается также
  • RyuJIT — признаюсь, не щупал. дождемся финального релиза )
имел ввиду мониторинг кода на «горячие» участки кода.

но спасибо за дополнение :)
Спасибо за отличную статью! Жалко только на VS2015 не получается то же самое провернуть: при попытку запустить sos жалуется
.load sos
Error during command: Warning. Extension is using a callback which Visual Studio does not implement.

Error during command: Exception c0000005 occurred at 59D66D56

спасибо :)

такая же проблема возникает и с VS2013. попробуте установить WDK.

кстати, это поведение зависит и от конфигурации (хочу заметить, что без WDK):
  • VS+Win7 — OK
  • VS (Update 3) + Win8.1 — OK
  • VS (Update 4) + Win8.1 — Fail
А можете объяснить для C++-программиста, как тот бесконечно рекурсивный шаблон из вашего примера разворачивается и работает? Вроде и статью прочитал, и все равно неясно.
Вы про Generics cyclomatic dependencies?

Все это «разворачивается» в 3 класса в каждом из которых по одному полю, более ничего.
Если бы эти поля инициализировались бы в конструкторе, то тогда мы получим stackoverflow — здесь CLR уже никаких оптимизаций не может делать

Хочу заметить, что новых специализаций не будет, т.е. остаются все те же 3 класса.

Надеюсь этот момент прояснился)
Да, погуглил ещё про дженерики, стало чуть понятнее вроде. Очень непривычно с такой вот рантаймовой штукой :)

А почему в конструкторе никаких оптимизаций не получится?
т.к. мы выделяем память явно.

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

так же это важно с семантической точки зрения, т.к. .NET поддерживает интроспекцию (Reflection), а каждый такой экземпляр должен будет иметь поле, которое также имеет поле и т.д. граф должен быть создан, если иницализация (т.е. конструктор вызван).
Просто не стоит воспринимать Generic как template и все будет нормально :)
Only those users with full accounts are able to leave comments. Log in, please.