Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# P/Invoke和C++;包装纸_C#_Performance_Pinvoke_Managed C++ - Fatal编程技术网

C# P/Invoke和C++;包装纸

C# P/Invoke和C++;包装纸,c#,performance,pinvoke,managed-c++,C#,Performance,Pinvoke,Managed C++,在学习p/Invoke的过程中,我问了前一个问题: 但是,我不太理解在C语言中使用P/Unjk在管理C++中创建包装器的含义。在C语言中使用p/Unjk创建相同的DLL,由于我可以在嵌入式资源上使用DLLIMPART,因此,它会产生更干净的接口,但是对于一个本地DLL,在我自己进行封送处理的托管C++封装中,性能会更好吗? C++包装器应该更快,请看一下: C++Interop使用最快的数据封送方法,而p/Invoke使用最健壮的方法。这意味着C++互操作(以C++为典型的方式)默认提供最佳

在学习p/Invoke的过程中,我问了前一个问题:


但是,我不太理解在C语言中使用P/Unjk在管理C++中创建包装器的含义。在C语言中使用p/Unjk创建相同的DLL,由于我可以在嵌入式资源上使用DLLIMPART,因此,它会产生更干净的接口,但是对于一个本地DLL,在我自己进行封送处理的托管C++封装中,性能会更好吗?

C++包装器应该更快,请看一下: C++Interop使用最快的数据封送方法,而p/Invoke使用最健壮的方法。这意味着C++互操作(以C++为典型的方式)默认提供最佳性能,程序员负责处理这种行为不安全或不合适的情况。 基本上,主要原因是P/Unjk做了钉住、BLIT、错误检查,而C++互操作只是将参数推到堆栈上并调用函数。p>

另一点要记住的是,C++可以在一个调用中调用多个API,而p/援引由地址传递的每个参数在每个调用上都被钉住并取消锁定,复制。


并复制回来,等等。

您能获得更好的性能吗?取决于你在做什么以及你是如何做的。一般来说,您的性能损失更可能来自于执行托管/非托管转换,并且您可以删除的转换越多越好。理想情况下,与非托管代码的接口应该是粗块的,而不是健谈的

假设您有一个包含数千个对象的非托管代码。您可以将这样的API公开给托管代码:

int GetFooCount();
IntPtr GetFoo(int n);
void ReleaseFoo(IntPtr p);
这一切都很好,直到你开始在C#中使用它,就像这样:

int total = API.GetFooCount();
IntPtr[] objects = new IntPtr[total];
for (int i=0; i < total; i++) {
    objects[i] = GetFoo(i);
}
// and later:
foreach (IntPtr p in objects) { ReleaseFoo(p); }
然后,您可以使用6个过渡来完成相同的工作。你认为哪一个表现更好

当然,下一个要问的重要问题是“这一性能提升值得吗?”因此请记住首先衡量

你应该意识到的一件事是,当你使用管理C++时,STL会发生有趣的事情。我有一些使用STL的非托管库代码。我的经验是,如果我曾经接触过托管C++中的任何STL类型,它们都成为托管实现。这样做的最终结果是,低级代码在迭代列表时执行托管/非托管转换。哎呀。我解决了这个问题,从不把STL类型暴露给托管C++。

我们的经验是,如果你有能力这样做,最好是(如果可能的话)去C语言>托管的C++包装器>静态库。

我以前已经读过,但是我读过它是指使用C++内部的C++互操作,而不是C++中的p/jk调用,速度更快,我无论如何都会假设它。它不一定解决从C到C到DLL的方式,而不是通过C/L到DLL通过P/CoopKeI而不这样认为-因为托管C++仍然是一种管理语言(转换为IL代码),调用它从C++中不应该引起大量的性能超额接受,因为这是非常正确的。我唯一困惑的是IL停止和本机代码在哪里停止,因为您可以使用C++中的本地指针和对象以及管理对象混合在一起。不清楚它可能会在什么地方离开托管空间并进入No.@ DrOrHelper-C++互操作(C++/CLI)是隐式P/Unk,当将PyPuxMungEngEdEsCururistic属性添加到P/UnjCK声明时,性能实际上比C++中的显式P/Cuffic更差。C++/CLI为来自C#的调用添加了额外的层。例如,当涉及字符串时,您必须分配内存或使用堆栈复制字符串,通过显式P/Invoke封送C#string要快得多。您可能想编写一些代码,看看它是如何像我一样工作的。@DrorHelper还有一篇关于代码项目的文章,作者声称C++/CLI速度更快,但读者在使用SuppressUnmanagedCodeSecurity时从他使用的同一个示例中看到了不同的结果。您可以从评论区中阅读它们。
int GetFooCount();
void GetFoos(IntPtr[] arr, int start, int count);
void ReleaseFoos(IntPtr arr, int start, int count);