เมื่อเปรียบเทียบโค้ดทดสอบกับ Sam ฉันคิดว่าเราทั้งคู่ถูกต้อง!
อย่างไรก็ตามเกี่ยวกับสิ่งต่าง ๆ :
- การเข้าถึงหน่วยความจำ (การอ่านและการเขียน) เป็นไปอย่างรวดเร็วไม่ว่าจะอยู่ที่ใด - สแต็ค, โกลบอลหรือฮีป
- อย่างไรก็ตามการจัดสรรจะเร็วที่สุดในสแต็กและช้าที่สุดในฮีป
stack
มันจะไปเช่นนี้: global
< heap
< (เวลาการจัดสรร) ใน
ทางเทคนิคแล้วการจัดสรรสแต็คไม่ใช่การจัดสรรจริง ๆ รันไทม์เพียงทำให้แน่ใจว่าส่วนหนึ่งของสแต็ก (เฟรม?) ถูกสงวนไว้สำหรับอาร์เรย์
ฉันแนะนำอย่างยิ่งให้ระวังอย่างนี้แม้ว่า
ฉันขอแนะนำดังต่อไปนี้:
- เมื่อคุณต้องการสร้างอาร์เรย์บ่อยครั้งซึ่งไม่เคยออกจากฟังก์ชั่น (เช่นผ่านการอ้างอิง) การใช้สแต็กจะเป็นการปรับปรุงที่ยิ่งใหญ่
- หากคุณสามารถรีไซเคิลอาร์เรย์ได้ให้ทำทุกครั้งที่ทำได้! ฮีปเป็นสถานที่ที่ดีที่สุดสำหรับการจัดเก็บวัตถุระยะยาว (การสร้างมลภาวะหน่วยความจำระดับโลกไม่ดี; กรอบสแต็กจะหายไป)
( หมายเหตุ : 1. ใช้กับประเภทค่าเท่านั้นประเภทการอ้างอิงจะถูกจัดสรรในฮีปและผลประโยชน์จะลดลงเป็น 0)
เพื่อตอบคำถามตัวเอง: ฉันไม่ได้พบปัญหาใด ๆ เลยกับการทดสอบกองใหญ่
ฉันเชื่อว่าปัญหาที่เป็นไปได้เพียงอย่างเดียวคือการล้นสแต็กหากคุณไม่ระวังในการเรียกใช้ฟังก์ชั่นและหน่วยความจำไม่เพียงพอเมื่อสร้างเธรดของคุณหากระบบทำงานต่ำ
ส่วนด้านล่างคือคำตอบเริ่มต้นของฉัน มันผิด - ish และการทดสอบไม่ถูกต้อง มันถูกเก็บไว้สำหรับการอ้างอิงเท่านั้น
การทดสอบของฉันระบุว่าหน่วยความจำที่จัดสรรแบบกองซ้อนและหน่วยความจำส่วนกลางช้ากว่าอย่างน้อย 15% (ใช้เวลา 120% ของเวลา) หน่วยความจำที่จัดสรรฮีปสำหรับการใช้งานในอาร์เรย์!
นี่คือรหัสทดสอบของฉันและนี่คือผลลัพธ์ตัวอย่าง:
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.
ฉันทดสอบบน Windows 8.1 Pro (พร้อมอัปเดต 1) โดยใช้ i7 4700 MQ ภายใต้. NET 4.5.1
ฉันทดสอบทั้งด้วย x86 และ x64 และผลลัพธ์นั้นเหมือนกัน
แก้ไข : ฉันเพิ่มขนาดสแต็กของเธรดทั้งหมด 201 MB ขนาดตัวอย่างเป็น 50 ล้านและลดการวนซ้ำเป็น 5
ผลลัพธ์จะเหมือนกับด้านบน :
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.
แต่ก็ดูเหมือนว่าสแต็คที่เป็นจริงได้รับช้า