在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++ 构建 int 或在 调用 每个 一个 数组      更新时间:2023-10-16

我用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++函数来释放内存。