在c#中构建一个int数组,每个int调用c++或在c++中构建并传递给c#
Build an array of ints in c# each calling c++ or build in c++ and pass to c#?
我用C++编写了一个函数,让我可以通过一个内部函数利用新的英特尔RdRand数字随机数生成器。
__declspec(dllexport) int __stdcall GetRdRand32(PUINT32 pValue)
{
return _rdrand32_step(pValue);
}
我已经包装好了,这样我就可以通过PInvoke在C#中使用它,它的工作原理如下:
[DllImport("CppDynamicLinkLibrary.dll", CallingConvention = CallingConvention.StdCall)]
public static extern int GetRdRand32(out UInt32 str);
我的用例通常涉及请求多个随机数,尽管一次可能只有数百个(每个请求者)。我的问题是,当我无论如何都在使用C++时,把另一个可以返回随机数的动态数组(或向量)的函数放在一起有意义吗?也就是说,与只调用C++DLL相比,这会大大提高性能吗?性能是一个问题,因为这将发生在服务器应用程序上,该应用程序可能会在类似的时间向许多客户端发送约200个随机数
如果这件事值得做,我该怎么做呢?我一直在思考以下内容,尽管我的猜测是,找到一种将向量放入C#的方法很容易成为性能问题?
__declspec(dllexport) void __stdcall vGetRdRand32(std::vector<UINT32> &pArray)
{
for (std::vector<UINT32>::iterator It = pArray.begin(); It != pArray.end(); It++ )
_rdrand32_step(&(*It));
}
最后,马歇尔。复制会比后一种方法更好吗?如果是的话,有人能给我指明正确的方向吗?
这取决于你需要多快。为了获得最快的rdrand性能,请使用64位rdrands并使用多个线程进行pull。即使在同一核心上有两个超线程,2个线程的拉动速度也是1个线程的2倍。
因此,如果将所有内核上的所有线程都设置为64位并行,则应该能够接近800MBytes/s。
这可能与直觉相悖,但它源于片上总线上的并行性,从而导致了这种性能特征。
在IvyBridge上,循环中的单个线程可能会获得70MBytes/s。
因此,对于200个随机数,呼叫开销将占主导地位。但对于几兆字节来说,如果您希望生成线程尽可能快,那么生成线程是值得的。
当然,从一个调用中获取200个随机数要比从200个不同的调用中获得200个随机号快。它甚至可能快很多倍。但很可能你说的是几毫秒的差异。所以这可能不值得做。几毫秒的差异会对应用程序的整体性能产生显著影响吗?
如果你决定这么做,你可能不想惹vector
,而是想惹UINT32[]
。在C#和C++之间编组vector
充其量是困难的。出于所有实际目的,这是不可能的。
有关如何封送数组的示例,请参阅封送不同类型的数组。
您可能想要在C#中分配数组,并将其与大小一起传递给C++函数。这样,您就不必担心释放内存。如果让C++代码分配数组并返回它,那么C#代码将不得不调用C++函数来释放内存。
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- CMake WxWidgets项目成功地在Linux上构建,但没有在Windows上构建
- 更改命令行 qt5 源代码构建配置的正确/快速方法
- 用CMake构建C++协议
- Mingw-64 在构建和安装后不会编译 openCV 代码