C#

[C#]코드 실행 시간 측정

DevStory 2021. 9. 25.

개발자로서 애플리케이션의 성능을 최적화하기 위해 코드 실행 시간을 측정하고 문제가 되는 코드를 수정하는 작업은 선택이 아닌 필수입니다.

 

비즈니스 로직을 처리하는 코드의 실행 시간을 측정하고 싶은 경우 C#에서는 Stopwatch 클래스를 사용할 수 있습니다.

 

이번 포스팅에서는 Stopwatch 클래스를 사용하여 코드 실행 시간을 측정하는 방법을 소개합니다.


Stopwatch 클래스

우선, Stopwatch 클래스를 사용하기 위해 using문에 System.Diagnostics 네임스페이스를 추가합니다.

using System.Diagnostics;

 

다음은 1,000,000,000번의 루프를 실행 시간을 측정하는 코드입니다.

Stopwatch watch = new Stopwatch();

int sum = 0;

watch.Start();

for(int i = 1; i < 1000000000; i++)
{
    sum += i;
}

watch.Stop();

Console.WriteLine($"1,000,000,000번의 Loop 시간 : {watch.ElapsedMilliseconds} ms");

Stopwatch 클래스의 인스턴스를 생성 후 Start() 메서드를 호출하여 코드 실행 시간을 측정합니다.

 

1,000,000,000번의 루프가 종료되면 Stop() 메서드를 호출하여 측정을 종료합니다.

 

Stopwatch 클래스의 ElapseMilliseconds 속성은 현재 인스턴스에서 측정한 밀리초 단위의 시간을 가져옵니다.

 

다음 코드는 코드 실행 시간을 측정을 잠시 중지하고 다시 측정하는 코드입니다.

Stopwatch watch = new Stopwatch();

int sum = 0;

watch.Start();

for(int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch.Stop();

if (!watch.IsRunning)
{
    Console.WriteLine($"500,000,000번의 Loop 시간 : {watch.ElapsedMilliseconds} ms");
    watch.Start();
}

for (int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch.Stop();
            
Console.WriteLine($"최종 측정 시간 : {watch.ElapsedMilliseconds} ms");

실행 결과

IsRunning 속성은 타이머가 실행 중인지 중단되었는지 여부를 bool형 값으로 반환합니다.

 

위 코드는 500,000,000번의 루프 실행 시간을 측정 후 타이머를 중단합니다.

 

그리고 IsRunning 속성을 호출하여 타이머가 중단되었으면, Start() 메서드를 호출하여 잠시 중지된 시간부터 측정합니다.

 

따라서 타이머를 잠시 중지시키고 다시 시작하여 코드의 총 실행 시간을 측정할 수 있습니다.

 

다음은 두 개의 for문을 측정하는 코드입니다.

Stopwatch watch1 = new Stopwatch();
Stopwatch watch2 = new Stopwatch();

int sum = 0;

watch1.Start();

for(int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch1.Stop();

Console.WriteLine($"첫 번째 for문 측정 시간 : {watch1.ElapsedMilliseconds} ms");

watch2.Start();

for (int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch2.Stop();

Console.WriteLine($"두 번째 for문 측정 시간 : {watch2.ElapsedMilliseconds} ms");

위 코드처럼 두 개의 Stopwatch 클래스의 인스턴스를 생성하여 측정할 수 있지만, 코드를 개선하여 한 개의 인스턴스로 측정할 수 있습니다.

 

다음 코드는 한 개의 인스턴스로 처리하는 코드입니다.

Stopwatch watch = new Stopwatch();

int sum = 0;

watch.Start();

for(int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch.Stop();

Console.WriteLine($"첫 번째 for문 측정 시간 : {watch.ElapsedMilliseconds} ms");

if (!watch.IsRunning)
    watch.Restart();

for (int i = 1; i < 500000000; i++)
{
    sum += i;
}

watch.Stop();

Console.WriteLine($"두 번째 for문 측정 시간 : {watch.ElapsedMilliseconds} ms");

실행 결과

첫 번째 for문 종료 후 타이머를 중지 후 Restart() 메서드를 호출하여 watch의 시간을 0으로 재설정하고 다시 측정을 시작합니다.

 

각 코드의 로직을 측정하기 위해 Stopwatch 인스턴스를 여러 개 생성할 필요 없습니다.

반응형

댓글