문제

이 질문은 이미 여기에 답이 있습니다.

C#에서 메소드 호출을 벤치마킹하는 방법을 찾고 있습니다.

나는 대학 할당을위한 데이터 구조를 코딩했으며 약간 최적화하는 방법을 생각해 냈지만 모든 상황에서 약간의 오버 헤드를 추가하는 방식으로 o (n) 호출을 o (1)로 바꾸는 방식으로 생각해 냈습니다. 일부.

이제 테스트 데이터에 대해 두 버전을 모두 실행하여 최적화를 구현할 가치가 있는지 확인하고 싶습니다. 루비에서는 벤치 마크 블록으로 코드를 랩핑하고 콘솔에서 블록을 실행하는 데 필요한 시간을 출력하게 할 수 있다는 것을 알고 있습니다. C#에 사용할 수있는 것과 비슷한 것이 있습니까?

도움이 되었습니까?

해결책

내장을 사용할 수 있습니다 스톱워치 클래스 "경과 시간을 정확하게 측정하는 데 사용할 수있는 일련의 방법과 속성을 제공합니다." 당신이 그것을 할 수있는 방법을 찾고 있다면. 그래도 자동화되지 않습니다.

다른 팁

Yuriy의 답변에서 도난 당하고 수정되었습니다.

private static void Benchmark(Action act, int iterations)
{
    GC.Collect();
    act.Invoke(); // run once outside of loop to avoid initialization costs
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < iterations; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine((sw.ElapsedMilliseconds / iterations).ToString());
}

특정 방법은 종종 몇 가지 사항을 초기화해야하며 전체 벤치 마크에 초기화 비용을 항상 포함 시키지는 않습니다. 또한 총 실행 시간을 반복 횟수로 나누려면 추정치가 반복 횟수와 무관하거나 무관하게됩니다.

Jon Skeet의 벤치마킹 방법에서 다음을 대부분 훔쳤습니다.

private static void Benchmark(Action act, int interval)
{
    GC.Collect();
    Stopwatch sw = Stopwatch.StartNew();
    for (int i = 0; i < interval; i++)
    {
        act.Invoke();
    }
    sw.Stop();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

시험과 오류로 내가 찾은 것들이 다음과 같습니다.

  1. (수천) 반복의 첫 번째 배치를 폐기하십시오. 그들은 아마도 지터의 영향을받을 것입니다.
  2. 별도의 벤치 마크를 실행합니다 Thread 물체는 더 좋고 더 안정적인 결과를 줄 수 있습니다. 왜 그런지 모르겠어요.
  3. 나는 어떤 사람들이 사용하는 것을 보았습니다 Thread.Sleep 벤치 마크를 실행하기 전에 어떤 이유로 든 이것은 상황을 악화시킬뿐입니다. 왜 그런지 모르겠어요. 아마도 지터로 인해.
  4. 디버깅 활성화로 벤치 마크를 실행하지 마십시오. 코드는 대부분의 순서가 느려질 가능성이 높습니다.
  5. 모든 최적화를 활성화하여 응용 프로그램을 컴파일하십시오. 일부 코드는 최적화에 의해 크게 영향을받을 수 있지만 다른 코드는 그렇지 않으므로 최적화없이 컴파일하면 벤치 마크의 신뢰성에 영향을 미칩니다.
  6. 최적화와 함께 컴파일 할 때 때때로 벤치 마크의 출력 (예 : 값 인쇄 등)을 어떻게 든 평가해야합니다. 그렇지 않으면 컴파일러는 일부 계산이 쓸모없고 단순히 수행하지 않을 수 있습니다.
  7. 대의원의 호출은 특정 벤치 마크를 수행 할 때 눈에 띄는 오버 헤드를 가질 수 있습니다. 오버 헤드가 벤치 마크 결과에 거의 영향을 미치지 않도록 대의원에 둘 이상의 반복을 넣는 것이 좋습니다.
  8. 프로파일 러는 고유 한 오버 헤드를 가질 수 있습니다. 코드의 어떤 부분이 병목 현상인지를 말하는 데 능숙하지만 실제로 두 가지 다른 것을 안정적으로 벤치마킹하는 데 능숙하지 않습니다.
  9. 일반적으로 멋진 벤치마킹 솔루션은 눈에 띄는 오버 헤드를 가질 수 있습니다. 예를 들어, 하나의 인터페이스를 사용하여 많은 객체를 벤치마킹하려면 클래스에서 모든 객체를 감싸고 싶은 유혹이있을 수 있습니다. 그러나 클래스 생성자는 또한 고려해야 할 오버 헤드가 있음을 기억하십시오. 모든 것을 가능한 한 간단하고 직접적으로 유지하는 것이 좋습니다.

원하는 것 같네요 프로파일 러. 나는 강력하게 추천 할 것이다 EQATEC 프로파일 러 나 자신, 그것은 내가 시도한 최고의 무료입니다. 간단한 스톱워치 1에 대한이 방법에 대한 좋은 점은 특정 방법/블록에 비해 성능의 고장을 제공한다는 것입니다.

프로파일 러는 모든 코드를 진단하기 때문에 최상의 벤치 마크를 제공하지만 속도가 느려집니다. 프로파일 러는 병목 현상을 찾는 데 사용됩니다.

알고리즘을 최적화하려면 병목 현상이 어디에 있는지 알면 이름-> stopwatch 사전을 사용하여 런타임 중에 성능 중요한 섹션을 추적하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top