본문 바로가기

C#

C# ValueTask와 Task 성능 비교 및 활용 전략

C#에서 비동기 프로그래밍 시 Task와 ValueTask는 자주 사용되는 두 가지 타입입니다. 각각의 특징과 성능 차이를 이해하면 더 효율적인 코드를 작성할 수 있습니다.

1. Task와 ValueTask 개요

Task는 비동기 작업의 기본 단위로, 오랫동안 사용되어온 대표적인 비동기 타입입니다. 반면 ValueTask는 비교적 최근에 도입되었으며, 불필요한 할당 비용을 줄여 성능을 향상시키기 위해 설계되었습니다.

2. 성능 차이

Task는 힙 할당이 발생해 가비지 컬렉션 부담이 있지만, ValueTask는 구조체로 스택에 할당되어 할당 비용이 줄어듭니다. 하지만 ValueTask는 여러 번 await 하면 상태 관리가 복잡해질 수 있어 주의가 필요합니다.

3. 사용 사례

간단한 캐시 조회나 즉시 완료 가능한 결과가 있을 때는 ValueTask 사용을 권장합니다. 반대로 복잡한 비동기 작업이나 여러 번 await이 필요한 경우에는 Task를 사용하는 것이 안전합니다.

4. 코드 예시

// Task 사용 예시
public async Task<int> GetDataAsync()
{
    await Task.Delay(100);
    return 42;
}

// ValueTask 사용 예시
public ValueTask<int> GetCachedDataAsync(bool cached)
{
    if (cached)
        return new ValueTask<int>(42); // 즉시 완료
    return new ValueTask<int>(GetDataAsync()); // Task 래핑
}

요약하면, ValueTask는 상황에 따라 적절히 활용하면 성능 이점을 가져올 수 있지만, 무분별한 사용은 코드 복잡성을 높일 수 있으므로 주의해야 합니다.