Kolam Array

Dec 15 2022
Saat ini, kita jarang menggunakan array. Dalam kebanyakan kasus, kami menggunakan List<T>, yang menyediakan lebih banyak fungsionalitas dan didasarkan pada larik di bawah tenda.

Saat ini, kita jarang menggunakan array. Dalam kebanyakan kasus, kami menggunakan List<T>, yang menyediakan lebih banyak fungsionalitas dan didasarkan pada larik di bawah tenda. Tetapi ada situasi ketika kinerja adalah kuncinya saat berhadapan dengan banyak objek.

Apa yang mengejutkan saya adalah bahwa array biasa dua kali lebih efisien dari Daftar, dan masih dapat dioptimalkan dengan ArrayPool.

Pada artikel ini, saya akan menunjukkan cara menggunakan ArrayPool dengan contoh kode dan kinerja pembandingan.

Repositori Kode

Apa itu ArrayPool

ArrayPool adalah kumpulan sumber daya yang memungkinkan penggunaan kembali instance tipe array. Anda dapat menggunakannya untuk Menyewa dan Mengembalikan buffer (array). Ini akan meningkatkan kinerja ketika Anda sering membuat dan menghancurkan array, yang memakan banyak memori dan PENGUMPUL SAMPAH . Kelas ini aman untuk thread, dan Anda dapat menggunakannya secara bersamaan. Saat kembali ke kumpulan, Anda dapat memilih untuk menghapus atau tidak menyusun konten. Membersihkan akan memakan waktu lebih lama, tetapi situasi Anda mungkin memerlukan larik kosong setiap saat.

Bagaimana cara menggunakannya

Ada dua cara untuk mengakses array dari memori kumpulan.

Yang pertama dan paling sederhana adalah dengan menggunakan properti ArrayPool Shared .

ArrayPool<T>.Dibagikan

Anda akan mendapatkan implementasi default dari kumpulan. Ini berisi array dengan ukuran berbeda. Itu dapat mengembalikan array yang lebih besar dari yang Anda minta tetapi tentu saja tidak lebih kecil. Kumpulan bersama adalah cara mudah untuk menggunakan kembali array, tetapi ada yang lebih baik.

Cara yang lebih efisien adalah menginisialisasi kumpulan Anda menggunakan metode buat.

ArrayPool<T>.Buat()

ArrayPool<T>.Buat(int maxArrayLength, int maxArraysPerBucket)

Buat metode mengembalikan contoh khusus dari kumpulan. Anda harus menyimpannya untuk mengaksesnya dari lokasi berbeda untuk menggunakannya kembali. Metode parameter dapat membantu mencapai kinerja terbaik. Ini akan membuat instance yang mengelompokkan array dengan panjang tidak lebih dari maxArrayLength ke dalam ember dengan ukuran maxArraysPerBucket.

Manfaatkan kumpulan array di C# untuk mengurangi alokasi dan meningkatkan performa aplikasi Anda.

Patokan

Ini adalah tes langsung. Kami akan membandingkan perbedaan antara membuat array baru dan menyewanya dari kumpulan. Dalam setiap kasus, kami akan mengulangi kumpulan 1_000_000 elemen. Saya juga akan menyertakan List<T> dalam tolok ukur untuk menunjukkan keunggulan kinerja array.

Repositori Kode

tolok ukur

Kesimpulan

Yang paling mengejutkan saya adalah bahwa array biasa dua kali lebih efisien dari Daftar dalam hal kecepatan dan penggunaan memori. Dan itu masih bisa dioptimalkan dengan ArrayPool. Menggunakan kolam jelas merupakan cara yang tepat.

Ada perbedaan waktu yang mencolok antara menggunakan larik standar dan larik dari kumpulan. Perbedaan waktu adalah waktu yang diperlukan untuk mengalokasikan memori saat membuat larik baru setiap kali. Tentu saja, ada juga perbedaan alokasi memori. ArrayPool tidak perlu mengalokasikan memori baru. Itu menggunakan kembali blok yang sama.

Sebagai peringatan, saya telah menambahkan 'Kumpulan Kustom Tanpa Caching' sehingga Anda dapat melihat apa yang terjadi saat Anda membuat kumpulan baru setiap saat. Ini pada dasarnya sama dengan membuat array baru setiap kali.

Dalam contoh sederhana ini, sulit untuk menunjukkan perbedaan kinerja antara ArrayPool bersama dan kustom. Ini akan terlihat ketika banyak array dengan ukuran berbeda digunakan.

Menggunakan ArrayPool mungkin tidak selalu nyaman, tetapi terkadang dapat menghemat banyak daya komputasi saat dibutuhkan.