Что можно сделать, чтобы ускорить вызов собственных методов из управляемого кода?Оптимизация управляемых нативных вызовов
Я пишу программу, которая должна иметь возможность управлять произвольными размерами списков объектов и извлекать из них информацию с высокой скоростью, которую она передает в скрипты. Скрипты - это бит скомпилированного кода на C#. Я пишу базовый уровень интерфейса с C++ (родной) DLL/SO/etc на уровень управления C# (.Net или Mono).
Теперь я тестировал, и я обнаружил, что в среднем PInvoking собственный метод из управляемого кода примерно в 100 раз медленнее, чем все это в управлении (все родные и все управляемые идентичны быстро, для справки).
Синтаксис Я использую это:
[DllImport("test.dll")]
extern static public String test_method(String value);
String returnedValue = test_method("hello world");
Есть ли способ, чтобы кэшировать указатель на функцию, код быстрого запустившего, что приведет к увеличению скорости после загрузки родной библиотеки? Это решило бы проблему довольно аккуратно, поэтому я сомневаюсь, что она существует. : P
Редактировать: Я не указал, но это должно работать на Windows, Linux (по крайней мере, Ubuntu) и Mac OS X, все для x86 и x64. В противном случае я бы пошел с интерфейсом C++/CLI и был сделан с ним, но если это не работает для всех трех платформ, я не могу его использовать.
Возможно, произошла конверсия строки и кодировки, которая замедляет это. Получаете ли вы аналогичное соотношение производительности, если вы измеряете функции с помощью i.e.int вместо строки? – x4u
Я не хочу упомянуть очевидное, но с тех пор, как 100x кажется мне непонятным в моем опыте, но вы не используете отладочные сборки \ и/или с отладчиком, приложенным при выполнении первичного измерения в коде .Net? –
@chibacity: Это действительно была отладочная версия с прикрепленным отладчиком. Хотя все компоненты, родные и управляемые, отлаживались отладчиками. Я снова запустил свой номер с релизами и проверил разницу. – ssube