Здравствуйте, 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.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.