Re[44]: MS забило на дотнет. Питону - да, сишарпу - нет?
От: Sinclair Россия https://github.com/evilguest/
Дата: 04.09.21 06:43
Оценка: 6 (2)
Здравствуйте, vdimas, Вы писали:

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

Ну, с практической точки зрения там почти всё — бессмысленно. Вот эти все "давайте получим анменеджед указатель на менеджед делегат, и вызовем его из менеджед кода" — нулевая практическая ценность.
Удивительно то, что вызов через делегат, ещё недавно чуть ли не на порядок проигрывавший вызову через интерфейс, теперь сравнялся — у меня делегат вышел даже быстрее.
В общем, предсказуемым образом, менеджед код быстрее всего вызывать через managed func pointer, а анменеджед — через PInvoke без переключения GC.

Methodm MeanErrorStdDevMedianOverhead Ratio
CallTestBaseline 173.9 μs3.44 μs9.37 μs173.2 μs0%
CallTestManaged func ptr245.1 μs3.37 μs2.63 μs244.9 μs100%
CallTestDelegate from MI335.8 μs3.94 μs3.29 μs336.2 μs227%
CallTestDelegate339.1 μs6.72 μs13.57 μs337.5 μs232%
CallTestInterface371.3 μs7.32 μs14.10 μs368.6 μs277%
CallTestDllImportNGC399.2 μs7.98 μs18.50 μs392.3 μs316%
CallTestDllImport901.5 μs14.52 μs12.12 μs896.8 μs1022%
CallTestDllGetProcAddr950.6 μs18.98 μs39.61 μs935.4 μs1091%
CallTestPtr from delegate1,572.6 μs19.71 μs21.91 μs1,564.2 μs1964%
CallTestUnmanaged func ptr8,796.0 μs174.14 μs232.47 μs8,690.9 μs12110%
CallTestDelegate from ptr10,214.0 μs158.16 μs231.83 μs10,140.2 μs14101%
Самый дешёвый вызов — по менеджед указателю — на моём процессоре стоит 7ns. Вызов через делегат — 16ns, в 2.3 раза дороже. Примерно в том же классе вызов через интерфейс.
Вызов простого PInvoke, который сам быстро исполняется и не лезет в менеджед-данные, стоит 22.5ns — втрое дороже, чем менеджед вызов, но всё ещё в 2.5 раза дешевле, чем обычный PInvoke через DllImport или через GetProcAddress. (73 ns). Вызовы менеджед кода как анменеджед стоят космически дорого (1мкс), но они и не нужны. Более жизненным сценарием было бы замерить вызов менеджед кода через колбэк.
Но и там основное, для чего нужно такое измерение — это чтобы понимать, какими должны быть масштабы объёма нативной работы, чтобы взаимодействие с ней было оправданым.
То есть когда мы говорим "вот тебе десять мегов данных, позови меня, когда отправишь" — это норм. А когда мы говорим: "вот тебе массив из 100 менеджед указателей, давай ты его отсортируешь, вызывая вот этот колбек для сравнения каждого из них" — это не норм, не надо так делать.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Отредактировано 04.09.2021 7:08 Sinclair . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.