foreach 구문 처리 속도가 점점 느려집니다.

음 저도 정확하게 이거다 라고 확답은 못드리겠지만 가비지 컬렉팅과 연관이 있을 것 같습니다.
시간이 지나면서 데이터를 많이 추가할수록 ← 에 착안했기 때문인데요.

닷넷에서 foreach를 통해 뭔가 동적으로 처리를 한다는 것은 눈으로 보이기엔 마법이지만 사실 내부적으로는 GC가 그것을 다 받아주고 있기 때문입니다.

아래 링크를 한번 확인하시고 이해하시면 도움이 되실 것도 같습니다.

결국 배열이고, 재할당이고 많이 쌓일수록 그만큼 더 제거해야하거든요… 또한 일반적으로 GC 스레드가 동작할 때는 모든 스레드가 일시 중단되므로 아마도…이게 맞지않을까 예상이 됩니다.

new int[0]은 카운트가 있으니 가비지는 아니고 , 처음 Add하면서 할당된 new int[4]가 에 1~4까지 숫자가 차있는 상태로 가비지가 되고, new int[8] 인 배열이 할당되고 거기에 1~5까지 들어가는 것입니다. 이렇게 재할당을 계속 발생시키는 행위는 GC가 제거할 레퍼런스 카운트가 0인 쓰레기 메모리가 계속 늘어난다는 의미 와 같은 의미입니다. 4, 8, 16, 32 …순서로 할당이 되니 만약 추가해야할 데이터가 10000개라면 4 + 8 + 16 + 32 + 64 + 128 + 256 + 512 + 1024 + 2048 + 4096 + 8192 + 16384 = 32764개의 메모리 영역이 필요합니다. 물론 16384개 이전의 4부터 8192까지 더한 16380개의 메모리는 쓰레기가 됩니다.

여기에 집중하시면 될 것 같습니다.

5개의 좋아요