Thread가 Task보다 더 빠르다는 어떤 예제

Thread가 Task보다 더 빠르다는 어떤 예제

이철우

C# Task는 DotNet 4.0부터 적용할 수 있으니 DotNet 1.1부터 있던 Thread 후배라고 할 수 있다. 靑出於籃이라고 Thread보다 Task를 사용하는 것이 더 나은 점이 있다고 생각해왔다. 사실 Task의 async/await 구문을 쓰면, 비동기/다중 Thread 구현이 쉽다.

2024년 2월 27일 medium.com에 올라온 글 - C# .NET에서 작업 및 스레드에 병렬 처리를 사용하는 6가지 방법[참고] - 에서 'Thread가 task보다 빠르다’고 주장한다. '어 그럴리가?'하고 그 글의 C# 코드를 살펴봤다.

참고의 문) 1초 기다린 뒤에 숫자를 하나씩 늘리는 기능을 100번 실행하는 것을 최적화하면, Thread와 Task는 각 얼마의 시간이 걸리나?

참고의 답) Thread 2초, Task 11초

참고의 결론) 이쁘게 코딩하려면 느리더라도 Task의 병렬(Parallel) 구현을 하자.

나의 반론) Task도 Thread만큼 빠르다.

[참고]의 두 번째 방법 - Using Tasks - 을 바꾸어 보겠다.

먼저 AnyMethod()를 다음과 같이 바꾸자.

async Task AnyMethod() => await Task.Delay(1000).ConfigureAwait(false);

그리고 UseTasks()를 바꾸자.

void UseTasks()
{
    var tasks = new List<Task>();

    for (int i = 0; i < 100; i++)
    {
        var task = Task.Run(async () =>
        {
            await AnyMethod().ConfigureAwait(true);
            lock (anyObject) count++;
        });
        tasks.Add(task);
    }

    Task.WaitAll(tasks.ToArray());
}

이제 이를 실행하면 [참고]의 UseThreads()와 비슷한 시간이 걸림을 알 수 있다. Task는 기능도 많고 편리한 만큼 정확히 알고 써야한다. 계속 진보하는 C#, 이를 따라가려면 학습 뿐, 다른 道理가 없다.

[참고]6 ways to use parallelism with Tasks and Threads in C# .NET

4 Likes

미디엄 글이 참 이상하군요.

task 안에서 Thread 슬립을 쓰다니…
미디엄 저자는 개발자가 아닌 거 같군요

4 Likes

C# 동시성에 대해 추천할 만한 책들

3 Likes

이건 Thread와 Task 간의 존재 목적의 차이를 성능 관점에서 잘못 짚어낸 아티클인 것 같네요.

UseThreads() 케이스가 2초 만에 완료되는 것은 개수 제한 없이 100개의 Thread를 동시에 생성해서 실행했기 때문이고, UseTasks() 케이스의 경우 ThreadPool에 이미 생성된 예약된 개수의 Worker Thread 자원 내에서 Task를 실행했기에 동기 방식인 Thread.Sleep메소드에 의해 작업이 밀렸기 때문이죠.

해당 아티클의 댓글에도 나와 있듯이 ThreadPool.SetMinThreads 메서드로 미리 ThreadPool 내 예약 Thread의 개수를 강제로 늘려 준 뒤 Task를 실행하면, 오히려 Thread 구동을 위한 자원 할당에 따른 시작, 종료 오버헤드가 줄어들어 UseTasks()가 더 빨리 실행되는 것을 알 수 있습니다.

@Chris_Shim 님 말씀대로 인터넷 상에는 좋은 글만 있는 건 아닌 것 같습니다.

9 Likes

@al6uiz 님 말씀이 맞습니다.


닷넷: 2263. C# - Thread가 Task보다 더 빠르다는 어떤 예제(?) (sysnet.pe.kr)

5 Likes

좋은 의견 많이 주셔서 고맙습니다.

그런데, 본문의 다중 쓰레드 또는 비동기 작업은 100개 입니다.
이것을 10000개로 바꾸어 테스트하면 어떻게 될까요?

async/await 구문은 100개일 때와 비슷한 시간에 작업을 마칩니다.
Thread 이건 오래 걸립니다.

async/await 쓰는 것을 추천합니다.

1 Like