テストコードをサムと比較したところ、私たちはどちらも正しいと判断しました。
ただし、さまざまなことについて:
- メモリへのアクセス(読み取りと書き込み)は、スタック、グローバル、ヒープのどこにいても同じくらい高速です。
- ただし、割り当てはスタックで最も速く、ヒープで最も遅くなります。
それはこのように書きます:stack
< global
< heap
。(割り当て時間)
技術的には、スタック割り当ては実際には割り当てではありません。ランタイムは、スタックの一部(フレーム?)が配列用に予約されていることを確認するだけです。
ただし、これには注意することを強くお勧めします。
私は以下をお勧めします:
- 関数を離れることのない配列を頻繁に作成する必要がある場合(たとえば、その参照を渡すことにより)、スタックを使用すると、大幅に改善されます。
- アレイをリサイクルできる場合は、できるだけリサイクルしてください。ヒープは、オブジェクトを長期間保存するのに最適な場所です。(グローバルメモリの汚染は良くありません。スタックフレームが消えることがあります)
(注:1.値型にのみ適用されます。参照型はヒープに割り当てられ、メリットは0に減少します)
質問自体に答えるには、大規模スタックテストでまったく問題が発生していません。
システムが不足している場合にスレッドを作成するときに関数呼び出しとメモリ不足に注意しないと、スタックオーバーフローのみが問題の可能性があると思います。
以下のセクションは私の最初の答えです。それは間違っているようで、テストは正しくありません。参考のために保管しています。
私のテストでは、スタックで割り当てられたメモリとグローバルメモリは、配列で使用するためにヒープに割り当てられたメモリよりも少なくとも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.
.NET 4.5.1の下でi7 4700 MQを使用して、Windows 8.1 Pro(Update 1付き)で
テストしました。x86とx64の両方でテストしましたが、結果は同じです。
編集:すべてのスレッドのスタックサイズを201 MBに増やし、サンプルサイズを5,000万に、反復を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.
ただし、スタックが実際に遅くなっているようです。