Queue Clear시 어떤 방식을 선호하시나요?

안녕하세요.
비가 많이 오는데 모두들 별일 없으시길 바랍니다!

자료구조 큐의 모든 원소를 제거할 때, Clear() 메서드가 없는 경우 어떤 방식으로 처리하시나요?
대표적으로 두 가지 방식이 있는 것으로 알고 있습니다.

  1. While(!q.Empty){ q.deque(); } 2. 새 인스턴스 할당

위 방식에 특징을 정리하면 아래와 같은데요,

  1. 효율적인 방식, 상대적으로 속도 느림
  2. 빠른 방식, GC 발생 가능

저는 2번 방식이 GC 발생시 더 느려질 수 도 있다고 생각해서 1번 방식을 주로 사용하는데,
자신만의 (근거 있는) 기준이 있는 분들 의견을 들어보고 싶습니다.
(+ 추가 하자면, Thread Safe한 ConcurrentQueue일 때도 달라질 점이 있는지도 궁금합니다.)

좋아요 2

흥미로운 질문입니다.

그런데 Queue에 Clear()가 없었던가요?

좋아요 1

C# ConcurrentQueue 경우에는 Clear() 없었습니다.

해당 글(Clear a ConcurrentQueue?)에서 “ConcurrentQueue’s implementation is based on a particular lock-free algorithm that doesn’t permit atomically clearing of the collection, hence why no Clear method is exposed.” 라는 이유로 제공하지 않는다고 합니다.

좋아요 2

공식 문서 기준으로는 C# ConcurrentQueue에 Clear가 확인 되긴 하는데
혹시 버전이 다르실까요?
ConcurrentQueue 클래스 (System.Collections.Concurrent) | Microsoft Docs
image

좋아요 2

.NET Core 2.0이상 부터는 있는데 .NET Framework에는 없었네요…

1번 방식이 메모리 할당을 하지 않으니 1번이 좋아 보입니다. 그리고 Dequeue()의 동작은 단지 인덱스 조정만 하는 것이라 생각보다 느리지도 않을 것 같고요.

다만 ConcurrentQueue는 스레드 안정적인 처리를 해야 하므로 조금은 느려질 것 같은데, 제 컴퓨터에서 간단히 테스트해보니 100만건의 Dequeue()동작이 7ms로 끝나니… 무시할 수준인 것 같습니다.

좋아요 4

죄송합니다. .Net Framework 기준이네요. 정정하겠습니다.

좋아요 2