我有一些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);
}