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