Перевод неуправляемого кода C ++ в управляемый C ++ для вызова из C # - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть некоторый код C #, который требует больших двоичных манипуляций, поэтому я написал неуправляемый метод C ++ для замены одного из методов C #. К моему шоку, это было в 10 раз медленнее. Я запустил профиль и обнаружил, что медлительность возникает из-за накладных расходов при вызове внешнего метода, а не самого метода.

Поэтому я подумал, что если я напишу метод в управляемом C ++, я потеряю издержки на вызов, но все равно буду иметь скорость C ++. Во-первых, верно ли это предположение?

Вот мой неуправляемый код C ++:

#include "stdafx.h";

unsigned __int32 _stdcall LSB_i32(unsigned __int32 x)
{
    DWORD result;
    _BitScanForward(&result, x);
    return (unsigned __int32)result;
}

Вот мой код C #:

public static partial class Binary
{
    [DllImport(@"CPP.dll")]
    public static extern int LSB_i32(int value);
}

Я что-то здесь не так делаю?

Как мне перевести вышеперечисленное в управляемый C ++? Я немного просмотрел этот вопрос, но, поскольку я не знаком с управляемым C ++, я не ушел далеко.

Ответы [ 2 ]

2 голосов
/ 25 декабря 2011

Вы можете оставить неуправляемый метод, но вам не следует вызывать его очень часто из управляемого кода. Например, если вы вызываете неуправляемый метод в узком цикле, то издержки маршалинга между управляемым и неуправляемым кодом будут огромными. Таким образом, вы можете попробовать поместить этот цикл в неуправляемый код, чтобы выполнить только один вызов метода. Тогда вы заплатите маршалинг только один раз, и весь тяжелый лифтинг будет выполнен в неуправляемом коде.

Что касается преобразования его в управляемый C ++, я очень сомневаюсь, что это принесет вам что-то лучше, чем то, с чего вы начали (то есть полностью управляемый код C #).

0 голосов
/ 25 декабря 2011

Вы можете попробовать, если реализация на чистом C # быстрее:

static int lzc(int x)
{
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);

    x = x - ((x >> 1) & 0x55555555);
    x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
    x = (x + (x >> 4)) & 0x0f0f0f0f;
    x = x + (x >> 8);
    x = x + (x >> 16);
    return 32 - (x & 0x0000003f);
}
...