Re[45]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: vdimas Россия  
Дата: 05.09.21 19:40
Оценка:
Здравствуйте, Sinclair, Вы писали:

V>>Хотя, подозреваю, что быстродействие вызова UnmanagedCallersOnly-метода должно быть примерно на уровне DllImport.

S>Ну, с практической точки зрения там почти всё — бессмысленно. Вот эти все "давайте получим анменеджед указатель на менеджед делегат, и вызовем его из менеджед кода" — нулевая практическая ценность.

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


S>Удивительно то, что вызов через делегат, ещё недавно чуть ли не на порядок проигрывавший вызову через интерфейс


Опять жжёшь. ))
Никогда делегат интерфейсу не проигрывал, откуда ты эту траву берёшь?

Этот вызов проигрывал только в цикле, например:
ISomeObj obj = ...;

for(int i = 0; i < 1000000; i++)
    obj.Foo();


Здесь джит один раз достаёт адрес фактической виртуальной ф-ии и вызывает потом миллион раз ф-ию по закешированному адресу (часто прямо в EAX).

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


S>теперь сравнялся — у меня делегат вышел даже быстрее.


Мне ты показал, что имел странные представления о происходящем в дотнете.


S>В общем, предсказуемым образом, менеджед код быстрее всего вызывать через managed func pointer, а анменеджед — через PInvoke без переключения GC.


Что такое "без переключения GC"?


S>Самый дешёвый вызов — по менеджед указателю — на моём процессоре стоит 7ns.


Ага, простой call EAX.
Только опять какие-то недостоверные у тебя данные — у меня в цикле этот вызов стоит в среднем 0.16 ns, что ближе к истине, т.к. безусловные jump и call, считай, бесплатны в современных процах.

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


S>Вызовы менеджед кода как анменеджед стоят космически дорого (1мкс), но они и не нужны.


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

Собсно, тест для того и был написан, чтобы уяснить для себя, как стоит использовать появившийся указатель на ф-ию в дотнете.
Вывод — в горячих ветках кода смешивать unmanaged и managed код через указатели не стоит.


S>То есть когда мы говорим "вот тебе десять мегов данных, позови меня, когда отправишь" — это норм.


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