複数の配列を 1 つの 3 次元配列にコピーする効率を向上させるために、開発者は次のような場合にパフォーマンスの問題に遭遇しました。次のコードを実行します:
for (int i = 0; i < sortedIndex.Length; i++) { if (i < num_in_left) { // add instance to the left child leftnode[i, 0] = sortedIndex[i]; leftnode[i, 1] = sortedInstances[i]; leftnode[i, 2] = sortedLabels[i]; } else { // add instance to the right child rightnode[i-num_in_left, 0] = sortedIndex[i]; rightnode[i-num_in_left, 1] = sortedInstances[i]; rightnode[i-num_in_left, 2] = sortedLabels[i]; } }
パフォーマンスの問題に対処するために、より高速な代替手段として Buffer.BlockCopy が導入されました。その主な目的は、ドキュメントに記載されているように、高速操作を容易にすることです:
このクラスは、System.Array クラスの同様のメソッドよりもプリミティブ型を操作するパフォーマンスが優れています。
Buffer。 BlockCopy は多次元配列を操作できます。最適なパフォーマンスを確保するには、要素数ではなくコピーするバイト数を指定し、プリミティブ配列を操作することが重要です。
応答3 つの 1D 配列を 3D 配列に結合することを目的とした更新された質問に対して、次のような魔法が考えられます。適用:
double[] sortedIndex, sortedInstances, sortedLabels; // copy them over to a 3d array double[] leftnode = new double[sortedIndex.Length, 3]; // magic happens here leftnode = {sortedIndex, sortedInstances, sortedLabels};
最適なアプローチを決定するために、Array.Copy、Buffer.BlockCopy、および Buffer.memcpyimpl の 3 つのメソッドを使用してベンチマーク テストを実施しました。結果から、これらのメソッドは非常に競争力があり、一般に Buffer.memcpyimpl が最も速いことが明らかになりました。ただし、パフォーマンスの違いはわずかであるため、1 つの方法を他の方法よりも選択することに過度に焦点を当てる必要はありません。
以上がC# で複数の配列を 3D 配列にコピーするときに、Buffer.BlockCopy によってパフォーマンスがどのように向上しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。