Оптимизировать управляемые звонки - PullRequest
10 голосов
/ 29 июля 2010

Что можно сделать, чтобы ускорить вызов собственных методов из управляемого кода?

Я пишу программу, которая должна иметь возможность управлять списками объектов произвольного размера и извлекать из них информацию на высокой скорости., который он подает в сценарии.Скрипты - это биты скомпилированного кода C #.Я пишу базовый интерфейсный уровень из C ++ (нативной) DLL / SO / и т. Д. В уровень управления C # (.Net или Mono).

Теперь я провел некоторое тестирование, и я 'мы обнаружили, что в среднем PInvoking собственного метода из управляемого кода примерно в 100 раз медленнее, чем все это в управляемом (для справки все нативное и все управляемое одинаково быстро.)is:

[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 и покончил с этим, но если это не работает для всех 3 платформ, я не могу его использовать.

Ответы [ 2 ]

4 голосов
/ 29 июля 2010

В дополнение к моему комментарию к вопросу мы установили, что это была отладочная сборка с прикрепленным отладчиком.Это оказывает массивное влияние на производительность .Net-кода во время выполнения.Легкая ошибка, чтобы сделать.:)

Я предполагаю, что с выпуском сборки и без отладчика, разница в производительности теперь намного более разумная.

Если у вас очень болтливый API, а вызываемые нативные методы дешевы, то издержки при вызове метода могут стать проблемой производительности.Попробуйте создать менее общительный API.Это типичная методика, используемая для повышения производительности пограничных \ системных коммуникаций.

Если производительность является приемлемой после сортировки проблемы отладчика, есть простая методика, которую я использовал, чтобы легко получить существенное увеличение производительности в чатеAPI, просто добавив один атрибут.

В классах, где у вас есть импортированные функции (например, функции DllImport), поместите атрибут SuppressUnmanagedCodeSecurity в классы.Это удалит дорогостоящую проверку безопасности при каждом вызове P / Invoke.Пожалуйста, ознакомьтесь с документацией по SuppressUnmanagedCodeSecurity , чтобы понять последствия этого.Я стараюсь сохранять импортированные функции сгруппированными во внутренних классах (которые содержат только импортированные функции) с применением этого атрибута.

3 голосов
/ 29 июля 2010

Возможно, сортировка строк вызывает замедление. Для сравнения попробуйте профилировать функцию, которая принимает и возвращает элементарные типы C ++, такие как int.

Вы также можете попробовать поэкспериментировать с C ++ / CLI. Таким образом, вы можете получить явный контроль над сортировкой и, возможно, увидеть улучшение.

В сборке C ++ / CLI:

System::String ^ test_method(System::String ^ args)
{
    pin_ptr<const wchar_t> pp = PtrToStringChars(args);
    //This might leak, probably needs a smart pointer to wrap it
    wchar_t* ret = native_method(pp);
    return gcnew String^(ret);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...