테스트 코드를 Sam과 비교할 때 우리 모두가 옳았다 고 판단했습니다!
그러나 다른 것들에 대해 :
- 메모리 액세스 (읽기 및 쓰기)는 스택, 전역 또는 힙 등 어디에서나 빠릅니다 .
- 그러나이를 할당 하는 것은 스택에서 가장 빠르며 힙에서 가장 느립니다.
다음과 같이 진행됩니다 : 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 (업데이트 1 포함)에서 테스트했습니다.
테스트했으며 x86 및 x64로 테스트했으며 결과는 동일합니다.
편집 : 모든 스레드 201MB의 스택 크기를 늘리고 샘플 크기를 5 천만으로 늘리고 반복을 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.
그러나 스택이 실제로 느려지 는 것처럼 보입니다 .