将非托管c++代码转换为托管c++,以便从c#调用

Translating unmanaged C++ code to managed C++ for calling from C#

本文关键字:c++ 调用 转换 代码      更新时间:2023-10-16

我有一些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++,所以我没有走远。

您可以保留非托管方法,但不应该经常从托管代码调用它。例如,如果在紧密循环中调用非托管方法,则托管代码和非托管代码之间的封送处理开销将是巨大的。因此,您可以尝试将此循环放入非托管代码中,以便仅对该方法执行一次调用。这样,您只需支付一次封送的代价,而整个繁重的工作将在非托管代码中完成。

至于将其转换为托管c++,我非常怀疑这会给你带来比你开始时更好的东西(即完全托管的c#代码)。

你可以试试如果纯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);
}