[C#] DateTime.Now는 함수의 성능을 측정하는 가장 좋은 방법입니까?


Answers

만약 당신이 빠르고 더러운 것을 원한다면, 스톱워치 대신에 더 높은 정밀도를 제안 할 것입니다.

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

또는 좀 더 정교한 것이 필요한 경우 ANTS 와 같은 타사 프로파일 러를 사용해야합니다.

Question

병목 현상을 발견하고 가능한 측정 시간을 정확하게 파악해야합니다.

다음 코드 스 니펫이 성능을 측정하는 가장 좋은 방법입니까?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);



벤치마킹 코드를 유틸리티 클래스 / 메소드로 푸시하는 것이 유용합니다. StopWatch 클래스는 오류 발생시 Disposed 또는 Stopped 일 필요가 없습니다. 그래서, 어떤 행동 을하기위한 가장 간단한 코드는

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

샘플 호출 코드

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat(“Did action in {0} ms.”, time);
}

다음은 확장 메소드 버전입니다.

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

그리고 샘플 호출 코드

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat(“Did action in {0} ms.”, time);
}



내 프로그램에서 사용하는 방법은 여기에 표시된 StopWatch 클래스를 사용하는 것입니다.

Stopwatch sw = new Stopwatch();
sw.Start();


// Critical lines of code

long elapsedMs = sw.Elapsed.TotalMilliseconds;



이것은 올바른 방법입니다.

using System;
using System.Diagnostics;

class Program
{
    public static void Main()
    {
        Stopwatch stopWatch = Stopwatch.StartNew();

            // some other code

        stopWatch.Stop();

        // this not correct to get full timer resolution
        Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);

        // Correct way to get accurate high precision timing
        Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
    }
}

자세한 내용은 정확한 성능 카운터를 얻으려면 DataTime 대신 스톱워치 사용 을 참조 하십시오 .




System.Diagnostics.Stopwatch 클래스를 사용하십시오.

Stopwatch sw = new Stopwatch();
sw.Start();

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.



이것들은 시간을 측정하는 훌륭한 방법이지만 병목 현상을 찾는 간접적 인 방법 일뿐입니다.

스레드에서 bottneck을 찾는 가장 직접적인 방법은 스레드를 실행시키고 기다리는 모든 작업을 수행하는 동안 일시 중지 또는 중단 키로 중지합니다. 이것을 여러 번하십시오. 병목 현상이 X % 시간이 걸리는 경우 X %는 각 스냅 샷의 작업에서이를 잡을 확률입니다.

방법 및 작동 원리에 대한보다 완벽한 설명이 있습니다.




방스 모리슨 (Vance Morrison)의 블로그에 그가 작성한 CodeTimer 클래스 에 대한 StopWatch 사용을보다 쉽게하고 측면에서 깔끔한 것들을 제공하는 게시물을 발견했습니다.




Links