我用 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));
}
最后,Marshal.Copy 会比后一种方法更好吗,如果可以的话,谁能指出我正确的方向?