#c# #performance
#c# #Производительность
Вопрос:
У меня есть библиотека dll win32 и два приложения, которые используют одну и ту же библиотеку dll. Один из них написан с использованием c в неуправляемом пространстве, а другой — приложение .net, которое вызывает неуправляемый код с помощью Pinvokes.
Иногда производительность приложения .net лучше, чем приложения c. Технически говоря, вызов неуправляемого кода из .net приводит к увеличению производительности, но не в этом случае.
Я проверил ссылку на msdn, и, похоже, есть какая-то предварительная обработка, которая происходит до выполнения фактического вызова. Во время компоновки загружается dll.
Я хочу понять, в каких сценариях .net-приложение превосходит?
Комментарии:
1. как вы измеряете производительность двух приложений и одинакова ли вся остальная логика для двух?
2. Как правило, собственные вызовы должны быть быстрее, посмотрите на это: codeproject.com/KB/dotnet/pinvokeperformance.aspx Вы уверены, что ваши измерения верны?
3. @AvadaKedavra — Я измерил конкретный вызов метода с помощью секундомера и времени для приложений .net и c соответственно.
Ответ №1:
Маршаллер pinvoke является одним из самых тяжелых оптимизированных фрагментов кода в .NET framework. Очень важно, есть много ошибок, которые вы не видите при запуске управляемой программы в неуправляемой операционной системе. Объем накладных расходов сильно варьируется. Это всего лишь несколько циклов процессора, когда DLL уже загружена, а аргументы функции pinvoked являются простыми целочисленными типами. До многих сотен циклов, когда, скажем, необходимы преобразования строк.
Ни при каких обстоятельствах это никогда не быстрее, чем собственный вызов. Точно измерить накладные расходы, которые составляют всего несколько циклов, сложно. И имейте в виду, что вы можете непреднамеренно измерить производительность вашей тестовой программы вместо вызова pinvoke.