Информация об изменениях

Сообщение Re[46]: MS забило на дотнет. Питону - да, сишарпу - нет? от 06.09.2021 2:39

Изменено 06.09.2021 7:01 Sinclair

Re[46]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, vdimas, Вы писали:
V>Да конечно, опять разбрасываешься громкими заявлениями.
V>GetFunctionPointerForDelegate — это единственный (ранее) был способ получать колбэки из нейтивного кода в управляемый.
Вы невнимательно читаете. Вот эту часть явно пропустили: "...и вызовем его из менеджед кода"

V>Опять жжёшь. ))

V>Никогда делегат интерфейсу не проигрывал, откуда ты эту траву берёшь?
Вопрос хороший. Я сам не мерил, но помню ещё на заре обсуждения дотнета бытовали такие мнения. Возможно — заблуждение.


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


V>Что такое "без переключения GC"?
То, что вы называете "замыкание стека", в официальной документации описывается как "переключение GC из кооперативного в вытесняющий режим".
V>Ага, простой call EAX.
V>Только опять какие-то недостоверные у тебя данные — у меня в цикле этот вызов стоит в среднем 0.16 ns, что ближе к истине, т.к. безусловные jump и call, считай, бесплатны в современных процах.
Я взял ваш же бенчмарк и запустил его. Может, конечно, я неправильно вычел и поделил...

V>Вычитай baseline из результатов, зря ты вывел столбец ratio — я же специально предупреждал.

Вы невнимательно читаете. Ratio — это отношение дополнительного времени (т.е. с вычтенным baseline) ко времени работы чемпиона. Поэтому у baseline ratio равен нулю, а у managed ptr — 100%

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


V>Это при такой эффективности не нужны.

V>А так бы был еще один инструмент проектирования — можно было бы некоторому коду подавать различные реализации, смешанно из нейтива и дотнета.
Это и так можно делать. Достаточно подавать этому коду только менеджед реализации; а в случае необходимости вызова анменеджед мы бы подавали менеджед-обёртку, которая вызывает PInvoke. Навскидку, это должно быть примерно втрое быстрее исследованного вами способа.
V>Да тоже не норм при такой цене.
О чём вы? Даже если предположить, что вся стоимость, замеренная вами — это цена unmanaged-to-managed transition (у вас же в обе стороны происходит переключение), то один вызов стоит примерно 8.6мкс.
При работе крупнымми блоками у нас характерная гранулярность вызова — миллисекунд 100, не меньше. Т.е. мы говорим об относительных стоимостях в 0.01%.
V>Т.е. колбэков из нейтива стоит избегать в горячем коде.
А можно хотя бы отдалённый намёк на то, что за горячий код собирается вызывать колбек из натива в менеджед?
Ну, мне просто интересно — это реальная задача, проистекающая из объективных ограничений, или просто архитектурный косяк, который нужно исправить.
Re[46]: MS забило на дотнет. Питону - да, сишарпу - нет?
Здравствуйте, vdimas, Вы писали:
V>Да конечно, опять разбрасываешься громкими заявлениями.
V>GetFunctionPointerForDelegate — это единственный (ранее) был способ получать колбэки из нейтивного кода в управляемый.
Вы невнимательно читаете. Вот эту часть явно пропустили: "...и вызовем его из менеджед кода"

V>Опять жжёшь. ))

V>Никогда делегат интерфейсу не проигрывал, откуда ты эту траву берёшь?
Вопрос хороший. Я сам не мерил, но помню ещё на заре обсуждения дотнета бытовали такие мнения. Возможно — заблуждение.


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


V>Что такое "без переключения GC"?
То, что вы называете "замыкание стека", в официальной документации описывается как "переключение GC из кооперативного в вытесняющий режим".
V>Ага, простой call EAX.
V>Только опять какие-то недостоверные у тебя данные — у меня в цикле этот вызов стоит в среднем 0.16 ns, что ближе к истине, т.к. безусловные jump и call, считай, бесплатны в современных процах.
Я взял ваш же бенчмарк и запустил его. Может, конечно, я неправильно вычел и поделил...

V>Вычитай baseline из результатов, зря ты вывел столбец ratio — я же специально предупреждал.

Вы невнимательно читаете. Ratio — это отношение дополнительного времени (т.е. с вычтенным baseline) ко времени работы чемпиона. Поэтому у baseline ratio равен нулю, а у managed ptr — 100%

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


V>Это при такой эффективности не нужны.

V>А так бы был еще один инструмент проектирования — можно было бы некоторому коду подавать различные реализации, смешанно из нейтива и дотнета.
Это и так можно делать. Достаточно подавать этому коду только менеджед реализации; а в случае необходимости вызова анменеджед мы бы подавали менеджед-обёртку, которая вызывает PInvoke. Навскидку, это должно быть примерно втрое быстрее исследованного вами способа.
V>Да тоже не норм при такой цене.
О чём вы? Даже если предположить, что вся стоимость, замеренная вами — это цена unmanaged-to-managed transition (у вас же в обе стороны происходит переключение), то один вызов стоит примерно 8.6мкс.
При работе крупнымми блоками у нас характерная гранулярность вызова — миллисекунд 100, не меньше. Т.е. мы говорим об относительных стоимостях в 0.01%.
V>Т.е. колбэков из нейтива стоит избегать в горячем коде.
А можно хотя бы отдалённый намёк на то, что за горячий код собирается вызывать колбек из натива в менеджед?
Ну, мне просто интересно — это реальная задача, проистекающая из объективных ограничений, или просто архитектурный косяк, который нужно исправить.
И, к тому же, надо бы замерить стоимость вызовов из анменеджед, применив UnmanagedCallersOnly.