Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Menggabungkan Berbilang Tatasusunan dengan Cekap dalam C#?

Bagaimanakah Saya Boleh Menggabungkan Berbilang Tatasusunan dengan Cekap dalam C#?

Barbara Streisand
Barbara Streisandasal
2024-12-28 06:03:10799semak imbas

How Can I Efficiently Combine Multiple Arrays in C#?

Penyelesaian Alternatif untuk Menggabungkan Tatasusunan dengan Cekap dalam C

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:

Menggunakan Buffer.BlockCopy

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));

Mengeksploitasi System.Buffer.memcpyimpl

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));
    }
}

Penanda Aras Prestasi

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn