Khi so sánh mã kiểm tra với Sam, tôi xác định rằng cả hai chúng tôi đều đúng!
Tuy nhiên, về những điều khác nhau:
- Truy cập bộ nhớ (đọc và viết) cũng nhanh như mọi lúc mọi nơi - stack, global hoặc heap.
- Phân bổ nó, tuy nhiên, là nhanh nhất trên stack và chậm nhất trên heap.
Nó đi như thế này: stack
< global
< heap
. (thời gian phân bổ)
Về mặt kỹ thuật, phân bổ ngăn xếp không thực sự là phân bổ, thời gian chạy chỉ đảm bảo một phần của ngăn xếp (khung?) được dành riêng cho mảng.
Tôi khuyên bạn nên cẩn thận với điều này, mặc dù.
Tôi khuyên bạn nên như sau:
- Khi bạn cần tạo các mảng thường xuyên mà không bao giờ rời khỏi hàm (ví dụ: bằng cách chuyển tham chiếu của nó), sử dụng ngăn xếp sẽ là một cải tiến rất lớn.
- Nếu bạn có thể tái chế một mảng, hãy làm như vậy bất cứ khi nào bạn có thể! Heap là nơi tốt nhất để lưu trữ đối tượng lâu dài. (gây ô nhiễm bộ nhớ toàn cầu không đẹp; khung stack có thể biến mất)
( Lưu ý : 1. chỉ áp dụng cho các loại giá trị; các loại tham chiếu sẽ được phân bổ trên heap và lợi ích sẽ giảm xuống 0)
Để tự trả lời câu hỏi: Tôi chưa gặp phải bất kỳ vấn đề nào với bất kỳ bài kiểm tra ngăn xếp lớn nào.
Tôi tin rằng vấn đề duy nhất có thể xảy ra là tràn ngăn xếp, nếu bạn không cẩn thận với các lệnh gọi chức năng và hết bộ nhớ khi tạo (các) luồng của mình nếu hệ thống sắp hết.
Phần dưới đây là câu trả lời ban đầu của tôi. Đó là sai-ish và các bài kiểm tra không đúng. Nó chỉ được giữ lại để tham khảo.
Thử nghiệm của tôi cho thấy bộ nhớ được cấp phát ngăn xếp và bộ nhớ chung chậm hơn ít nhất 15% so với (chiếm 120% thời gian) bộ nhớ được phân bổ heap để sử dụng trong các mảng!
Đây là mã thử nghiệm của tôi và đây là đầu ra mẫu:
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.
Tôi đã thử nghiệm trên Windows 8.1 Pro (với Bản cập nhật 1), sử dụng i7 4700 MQ, trong .NET 4.5.1
Tôi đã thử nghiệm cả với x86 và x64 và kết quả là giống hệt nhau.
Chỉnh sửa : Tôi đã tăng kích thước ngăn xếp của tất cả các luồng 201 MB, kích thước mẫu lên 50 triệu và giảm số lần lặp xuống còn 5.
Kết quả giống như trên :
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.
Mặc dù, có vẻ như ngăn xếp thực sự đang trở nên chậm hơn .