본문 바로가기
Programming/C#

[C#] 반복문에서 삼항연산자 vs Func 뭐가 좋을까?

by 째스터 2024. 3. 8.
728x90

업무를 하다가 문득 이런 생각이 들었다.
'다음과 같은 반복문 안에서 _condition은 항상 true 또는 false인데
매번 for문 안에서 체크하는 것이 비효율적인 것 같다.'

 for (var i = 0; i < repeat; i++)
 {
     value = _condition ? i * 2 : i;
     
     // ...
 }

그렇다면 Func Delegate를 이용하는 방법은 어떨까?
반복문 밖에서 한번 선언해 두게 되면 매번 체크하지 않으니 성능이 좋지 않을까?
근데 delegate invoke로 인한 오버헤드가 있지 않을까?

Func<int, int> getValue = _condition ? input => input * 2 : input => input;

for (var i = 0; i < repeat; i++)
{
    value = getValue(i);
    
    // ...
}

그래서 성능을 직접 측정해 보기로 했다.
그래서 결과는?

삼항 연산자를 사용하는 것이 좀 더 빨랐다.
실제로 회사에서 더 복잡한 코드로 테스트했을 때도 삼항 연산자가 더 빨랐었다.

 


- 테스트 코드

var repeat = 10_000_000;
var _condition = true;
int value;

var stopwatch = new Stopwatch();
stopwatch.Start();

for (var i = 0; i < repeat; i++)
{
    value = _condition ? i * 2 : i;
}

stopwatch.Stop();

Debug.WriteLine($"Ternary: {stopwatch.ElapsedMilliseconds} ms");

stopwatch.Restart();

Func<int, int> getValue = _condition ? input => input * 2 : input => input;

for (var i = 0; i < repeat; i++)
{
    value = getValue(i);
}

stopwatch.Stop();

Debug.WriteLine($"Func: {stopwatch.ElapsedMilliseconds} ms");
728x90

댓글