C++ で関数を作成し、組み込み関数を介して新しい Intel 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 は後者のアプローチよりも優れているでしょうか。