将非托管c++代码转换为托管c++,以便从c#调用
Translating unmanaged C++ code to managed C++ for calling from C#
我有一些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);
}
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 如何用参数值调用函数(仅在运行时已知)
- std::cout.imbue()多重调用
- 函数何时会在c++中包含stack_Unwind_Resume调用