提供されたコード スニペットは、3 つの配列を 1 つの 3 次元配列にコピーするときにパフォーマンスが低下します。より高速な実行を実現するための代替ソリューションをいくつか紹介します。
Buffer.BlockCopy は、配列内のプリミティブ型の高速操作用に特別に設計されています。 System.Array の同様のメソッドに比べてパフォーマンスが大幅に向上します。 Buffer.BlockCopy を使用するには、次の手順に従います。
double[] sortedIndex, sortedInstances, sortedLabels; double[,] leftnode = new double[sortedIndex.Length, 3]; // Copy sortedIndex into the first column of leftnode Buffer.BlockCopy(sortedIndex, 0, leftnode, 0, sortedIndex.Length * sizeof(double)); // Copy sortedInstances into the second column of leftnode Buffer.BlockCopy(sortedInstances, 0, leftnode, sortedIndex.Length * sizeof(double), sortedInstances.Length * sizeof(double)); // Copy sortedLabels into the third column of leftnode Buffer.BlockCopy(sortedLabels, 0, leftnode, sortedIndex.Length * sizeof(double) + sortedInstances.Length * sizeof(double), sortedLabels.Length * sizeof(double));
最適なパフォーマンスを得るには、基になる関数である System.Buffer.memcpyimpl を直接呼び出すことができます。 Buffer.BlockCopy によって使用されます。このメソッドにはポインターが必要ですが、最大速度が得られるように最適化されています。ただし、プリミティブ配列でのみ動作することに注意してください。
//assuming arrays of primitives and pointers are available double[] sortedIndex, sortedInstances, sortedLabels; double[,] leftnode = new double[sortedIndex.Length, 3]; unsafe { fixed (double* pSortedIndex = &sortedIndex[0]) fixed (double* pSortedInstances = &sortedInstances[0]) fixed (double* pSortedLabels = &sortedLabels[0]) fixed (double* pLeftnode = &leftnode[0, 0]) { Buffer.memcpyimpl((byte*)pSortedIndex, (byte*)pLeftnode, sortedIndex.Length * sizeof(double)); Buffer.memcpyimpl((byte*)pSortedInstances, (byte*)pLeftnode + sortedIndex.Length * sizeof(double), sortedInstances.Length * sizeof(double)); Buffer.memcpyimpl((byte*)pSortedLabels, (byte*)pLeftnode + sortedIndex.Length * sizeof(double) + sortedInstances.Length * sizeof(double), sortedLabels.Length * sizeof(double)); } }
経験的に、Buffer.BlockCopy と System.Buffer.memcpyimpl は競合するパフォーマンスを示します。多くの場合、どちらかを選択するのは無視できるほどです。
以上がC# で複数の配列を効率的に組み合わせるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。