programing

메서드의 실행 시간 계산

elecom 2023. 6. 2. 20:06
반응형

메서드의 실행 시간 계산

중복 가능성:
기능이 실행되는 시간을 측정하려면 어떻게 해야 합니까?

한 위치에서 다른 위치로 데이터를 복사하는 I/O 시간이 걸리는 방법이 있습니다.실행 시간을 계산하는 가장 좋고 실제적인 방법은 무엇입니까? Thread?Timer?Stopwatch다른 해결책은?저는 가장 정확하고 가능한 한 가장 간단한 것을 원합니다.

Stopwatch 이를 위해 설계되었으며 .NET에서 시간 실행을 측정하는 가장 좋은 방법 중 하나입니다.

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

DateTime을 사용하여 .NET에서 시간 실행을 측정하지 마십시오.


업데이트:

@series0ne이 설명 섹션에서 지적한 바와 같이,일부 코드의 실행을 정확하게 측정하려면 운영 체제에 내장된 성능 카운터를 사용해야 합니다.다음 답변에는 멋진 개요가 포함되어 있습니다.

개인적인 경험으로 볼 때,System.Diagnostics.Stopwatch클래스를 사용하여 메서드의 실행 시간을 측정할 수 있지만 주의:그것은 완전히 정확하지는 않습니다!

다음 예를 생각해 보십시오.

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

예제 결과

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

이제 궁금하실 겁니다. "왜 처음에는 132ms가 걸렸고, 나머지 시간은 훨씬 걸렸습니까?"

정답은Stopwatch는 JITing과 같은 .NET의 "백그라운드 노이즈" 활동을 보상하지 않습니다.따라서 메서드를 처음 실행할 때는 .NET JIT가 먼저 실행됩니다.이 작업에 소요되는 시간이 실행 시간에 추가됩니다.마찬가지로, 다른 요인들도 실행 시간을 다양하게 만듭니다.

절대적인 정확성을 추구해야 하는 것은 성능 프로파일링입니다!

다음을 살펴 보십시오.

RedGate ANTS Performance Profiler는 상용 제품이지만 매우 정확한 결과를 산출합니다. - .NET 프로파일링을 통해 애플리케이션 성능 향상

프로파일링에 대한 StackOverflow 기사가 있습니다. - 좋은 .NET 프로파일러란?

또한 Stopwatch를 사용한 성능 프로파일링에 대한 기사를 작성했습니다. - .NET의 성능 프로파일링을 살펴보십시오.

StopWatch 수업은 당신의 최고의 해결책을 찾습니다.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

또한 정적 필드가 있습니다. 물론 하드웨어와 운영 체제의 문제입니다.

타이머가 고해상도 성능 카운터를 기반으로 하는지 여부를 나타냅니다.

성능을 이해하는 데 관심이 있다면 프로파일러를 사용하는 것이 가장 좋습니다.

그렇지 않으면 시스템.진단.StopWatch는 고해상도 타이머를 제공합니다.

다음 Microsoft 문서를 따릅니다.

using System;
using System.Diagnostics;
using System.Threading;
class Program
{
    static void Main(string[] args)
    {
        Stopwatch stopWatch = new Stopwatch();
        stopWatch.Start();
        Thread.Sleep(10000);
        stopWatch.Stop();
        // Get the elapsed time as a TimeSpan value.
        TimeSpan ts = stopWatch.Elapsed;

        // Format and display the TimeSpan value.
        string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
            ts.Hours, ts.Minutes, ts.Seconds,
            ts.Milliseconds / 10);
        Console.WriteLine("RunTime " + elapsedTime);
    }
}

출력:RunTime 00:00:09.94

StopWatch가 고해상도 카운터를 사용합니다.

Stopwatch는 기본 타이머 메커니즘에서 타이머 눈금을 카운트하여 경과 시간을 측정합니다.설치된 하드웨어와 운영 체제가 고해상도 성능 카운터를 지원하는 경우 Stopwatch 클래스는 해당 카운터를 사용하여 경과 시간을 측정합니다.그렇지 않은 경우 Stopwatch 클래스는 시스템 타이머를 사용하여 경과 시간을 측정합니다.주파수 및 IsHighResolution 필드를 사용하여 Stopwatch 타이밍 구현의 정밀도와 분해능을 결정합니다.

IO를 측정하는 경우 외부 이벤트에 의해 수치가 영향을 받을 가능성이 높기 때문에 위에서 설명한 것처럼 정확성이 매우 걱정됩니다.대신에 저는 다양한 측정을 하고 그 수치들의 평균과 분포를 고려할 것입니다.

또한 "시스템이 시작된 후 경과한 시간(밀리초)을 가져옵니다."라는 항목도 사용합니다.

System.Environment.TickCount

예를들면

static void method1()
{
    for (int i = 1; i <= 100; i++)
    {
        Console.WriteLine("Test1 " + i);
    }
}
static void Main(string[] args)
{
    var startTime = Environment.TickCount;
    method1();
    var endTime = Environment.TickCount;
    Console.WriteLine("RunTime " + (endTime - startTime));
}
 using System.Diagnostics;
 class Program
 {
    static void Test1()
    {
        for (int i = 1; i <= 100; i++)
        {
            Console.WriteLine("Test1 " + i);
        }
    }
  static void Main(string[] args)
    {

        Stopwatch sw = new Stopwatch();
        sw.Start();
        Test1();
        sw.Stop();
        Console.WriteLine("Time Taken-->{0}",sw.ElapsedMilliseconds);
   }
 }

언급URL : https://stackoverflow.com/questions/14019510/calculate-the-execution-time-of-a-method

반응형