Setelah membandingkan kode uji dengan Sam, saya memutuskan bahwa kami berdua benar!
Namun, tentang berbagai hal:
- Mengakses memori (membaca dan menulis) sama cepatnya di mana pun itu - tumpukan, global atau tumpukan.
- Mengalokasikan itu, bagaimanapun, adalah tercepat pada stack dan paling lambat di heap.
Bunyinya seperti ini: stack
< global
< heap
. (alokasi waktu)
Secara teknis, alokasi tumpukan tidak benar-benar alokasi, runtime hanya memastikan bagian dari tumpukan (bingkai?) dicadangkan untuk array.
Saya sangat menyarankan untuk berhati-hati dengan ini.
Saya merekomendasikan yang berikut ini:
- Ketika Anda perlu membuat array sering yang tidak pernah meninggalkan fungsi (misalnya dengan melewatkan referensi), menggunakan stack akan menjadi peningkatan yang sangat besar.
- Jika Anda dapat mendaur ulang array, lakukan kapan saja Anda bisa! Tumpukan adalah tempat terbaik untuk penyimpanan objek jangka panjang. (Mencemari memori global tidak bagus; tumpukan frame dapat menghilang)
( Catatan : 1. hanya berlaku untuk tipe nilai; tipe referensi akan dialokasikan pada heap dan manfaatnya akan dikurangi menjadi 0)
Untuk menjawab pertanyaan itu sendiri: Saya belum menemukan masalah sama sekali dengan tes tumpukan besar.
Saya percaya satu-satunya masalah yang mungkin terjadi adalah stack overflow, jika Anda tidak berhati-hati dengan panggilan fungsi dan kehabisan memori saat membuat utas Anda jika sistem hampir habis.
Bagian di bawah ini adalah jawaban awal saya. Itu salah dan tesnya tidak benar. Itu disimpan hanya untuk referensi.
Pengujian saya menunjukkan memori yang dialokasikan tumpukan dan memori global setidaknya 15% lebih lambat daripada (membutuhkan 120% waktu) memori tumpukan yang dialokasikan untuk penggunaan dalam array!
Ini adalah kode pengujian saya , dan ini adalah contoh output:
Stack-allocated array time: 00:00:00.2224429
Globally-allocated array time: 00:00:00.2206767
Heap-allocated array time: 00:00:00.1842670
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 100.80 %| 120.72 %|
--+---------+---------+---------+
G | 99.21 %| - | 119.76 %|
--+---------+---------+---------+
H | 82.84 %| 83.50 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
Saya menguji pada Windows 8.1 Pro (dengan Pembaruan 1), menggunakan i7 4700 MQ, di bawah .NET 4.5.1
Saya menguji keduanya dengan x86 dan x64 dan hasilnya identik.
Sunting : Saya meningkatkan ukuran tumpukan semua utas 201 MB, ukuran sampel menjadi 50 juta dan mengurangi iterasi ke 5.
Hasilnya sama seperti di atas :
Stack-allocated array time: 00:00:00.4504903
Globally-allocated array time: 00:00:00.4020328
Heap-allocated array time: 00:00:00.3439016
------------------------------------------
Fastest: Heap.
| S | G | H |
--+---------+---------+---------+
S | - | 112.05 %| 130.99 %|
--+---------+---------+---------+
G | 89.24 %| - | 116.90 %|
--+---------+---------+---------+
H | 76.34 %| 85.54 %| - |
--+---------+---------+---------+
Rates are calculated by dividing the row's value to the column's.
Padahal, sepertinya stack sebenarnya semakin lambat .