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() 없었습니다.

해당 글(https://social.msdn.microsoft.com/Forums/ko-KR/accf4254-ee81-4059-9251-619bc6bbeadf/clear-a-concurrentqueue?forum=rx)에서 “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개의 좋아요