Coretan kod yang disediakan mempamerkan prestasi perlahan dalam menyalin tiga tatasusunan ke dalam tatasusunan tiga dimensi tunggal. Berikut ialah beberapa penyelesaian alternatif untuk mencapai pelaksanaan yang lebih pantas:
Buffer.BlockCopy direka khusus untuk manipulasi berkelajuan tinggi jenis primitif dalam tatasusunan. Ia menawarkan peningkatan prestasi yang ketara berbanding kaedah serupa dalam System.Array. Untuk menggunakan Buffer.BlockCopy, ikut langkah berikut:
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));
Untuk prestasi optimum, anda boleh terus menggunakan System.Buffer.memcpyimpl, yang merupakan fungsi asas digunakan oleh Buffer.BlockCopy. Kaedah ini memerlukan penunjuk tetapi dioptimumkan untuk kelajuan maksimum. Walau bagaimanapun, ambil perhatian bahawa ia hanya beroperasi pada tatasusunan primitif.
//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)); } }
Secara empirik, Buffer.BlockCopy dan System.Buffer.memcpyimpl mempamerkan prestasi kompetitif. Pilihan antara mereka selalunya diabaikan.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggabungkan Berbilang Tatasusunan dengan Cekap dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!