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
Lepaskan: 2024-12-28 06:03:10
asal
793 orang telah melayarinya

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));
Salin selepas log masuk

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));
    }
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan