문제

저는 완전히 초보자이지만 C#에서 문자열을 처리하는 작은 프로그램을 작성하고 있었는데 몇 가지 작업을 다르게 수행하면 코드가 훨씬 더 빠르게 실행된다는 것을 알았습니다.

그래서 코드 실행 속도를 어떻게 측정하는지 궁금합니다.(무료) 유틸리티가 있나요?System.Timer를 사용하여 옛날 방식으로 처리하고 직접 처리하시나요?

도움이 되었습니까?

해결책

당신이 설명하는 것은 성능 프로파일링으로 알려져 있습니다.이를 수행할 수 있는 프로그램은 다음과 같습니다. Jetbrains 프로파일러 또는 개미 프로파일러, 대부분의 경우 성능을 측정하는 동안 애플리케이션 속도가 느려집니다.

자신만의 성능 프로파일링을 직접 작성하려면 다음을 사용할 수 있습니다. 시스템.진단.스톱워치 설명하신 것처럼 간단한 Console.WriteLine도 있습니다.

또한 C# JIT 컴파일러는 호출되는 유형과 빈도에 따라 코드를 최적화하므로 재귀 호출과 같은 다양한 크기와 방법의 루프를 사용해 보면서 무엇이 가장 잘 작동하는지 파악해 보세요.

다른 팁

RedGate의 ANTS 프로파일러 정말 좋은 성능 프로파일러입니다. JetBrains의 dotTrace 프로파일러 또한 훌륭합니다.이러한 도구를 사용하면 각 개별 라인을 드릴다운할 수 있는 성능 측정항목을 볼 수 있습니다.

ANTS 프로파일러의 스크린샷:개미 http://www.red-gate.com/products/ants_profiler/images/app/timeline_calltree3.gif

단위 테스트 중에 특정 메서드가 특정 성능 임계값 내에 유지되는지 확인하려면 다음을 사용합니다. Stopwatch 수업 루프에서 메서드의 실행 시간을 한 번 또는 여러 번 모니터링하고 평균을 계산한 다음 Assert 결과에 반대합니다.

알림 - 디버그가 아닌 Relase에서 컴파일해야 합니다!(저는 노련한 개발자들이 저지른 이런 실수를 본 적이 있습니다. 이는 잊어버리기 쉽습니다.)

당신이 설명하는 것은 '성능 튜닝'입니다.성능 튜닝에 관해 이야기할 때 두 가지 측면이 있습니다.(a) 응답 시간 - 특정 요청/프로그램을 실행하는 데 걸리는 시간입니다.(b) 처리량 - 초당 실행할 수 있는 요청 수입니다.일반적으로 '최적화'하면 불필요한 처리를 제거하면 응답 시간과 처리량이 모두 향상됩니다.그러나 코드에 대기 이벤트(Thread.sleep(), I/O 대기 등)가 있는 경우 응답 시간은 영향을 받지만 처리량은 영향을 받지 않습니다.병렬 처리(여러 스레드 생성)를 채택하면 응답 시간은 향상될 수 있지만 처리량은 향상되지 않습니다.일반적으로 서버 측 애플리케이션의 경우 응답 시간과 처리량이 모두 중요합니다.IDE와 같은 데스크탑 애플리케이션의 경우 처리량은 중요하지 않으며 응답 시간만 중요합니다.

'성능 테스트'를 통해 응답 시간을 측정할 수 있습니다. 모든 주요 트랜잭션에 대한 응답 시간을 기록하기만 하면 됩니다.'부하 테스트'를 통해 처리량을 측정할 수 있습니다. 서버 시스템의 CPU 사용량이 80-90%가 되도록 충분히 많은 수의 스레드/클라이언트에서 지속적으로 요청을 펌핑해야 합니다.요청을 펌핑할 때 서로 다른 트랜잭션 간의 비율(트랜잭션 믹스라고 함)을 유지해야 합니다. 예를 들면 다음과 같습니다.예약 시스템에서는 100건의 검색마다 10건의 예약이 발생합니다.예약 10건당 1건의 취소가 발생합니다.

응답 시간 조정(성능 테스트)이 필요한 트랜잭션을 식별한 후 프로파일러를 사용하여 핫스팟을 식별할 수 있습니다.응답 시간 * 해당 트랜잭션의 비율을 비교하여 처리량에 대한 핫스팟을 식별할 수 있습니다.검색, 예약, 취소 시나리오에서 비율이 89:10:1이라고 가정합니다.응답시간은 0.1초, 10초, 15초입니다.검색 용로드 -0.1 * .89 = 0.089 예약의 경우로드 -10 * .1 = 1 Cancell의로드 = 15 * .01 = 0.15 여기서 튜닝 예약은 처리량에 최대 영향을 미칩니다.스레드 덤프(Java 기반 애플리케이션의 경우)를 반복적으로 수행하여 처리량에 대한 핫스팟을 식별할 수도 있습니다.

프로파일러를 사용하세요.

특정 방법 하나만 시간을 측정해야 하는 경우 Stopwatch 클래스가 좋은 선택일 수 있습니다.

나는 다음과 같은 일을 합니다:1) 나는 진드기를 사용합니다(예:VB.Net Now.ticks에서) 현재 시간을 측정합니다.완료된 틱 값에서 시작 틱을 빼고 TimeSpan.TicksPerSecond로 나누어 소요된 시간(초)을 구합니다.2) UI 작업(예: console.writeline)을 피합니다.3) 사용량/OS 변수를 최대한 배제하기 위해 상당한 루프(예: 100,000회 반복)에 걸쳐 코드를 실행합니다.

StopWatch 클래스를 사용하여 메소드 시간을 측정할 수 있습니다.코드를 지팅해야 하기 때문에 처음에는 속도가 느린 경우가 많습니다.

일부 성능 분석 요구 사항을 해결할 수 있는 기본 .NET 옵션(소프트웨어 개발자용 Team Edition)이 있습니다.2005 .NET IDE 메뉴에서 도구->성능 도구->성능 마법사...를 선택합니다.

[GSS는 아마도 Team Edition이 있어야 한다는 말이 맞을 것입니다.]

이것은 코드 속도를 테스트하는 간단한 예입니다.내가 당신을 도왔기를 바랍니다.

class Program {
    static void Main(string[] args) {
        const int steps = 10000;
        Stopwatch sw = new Stopwatch();

        ArrayList list1 = new ArrayList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list1.Add(i);
        }
        sw.Stop();
        Console.WriteLine("ArrayList:\tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);

        MyList list2 = new MyList();
        sw.Start();
        for(int i = 0; i < steps; i++) {
            list2.Add(i);
        }
        sw.Stop();
        Console.WriteLine("MyList:  \tMilliseconds = {0},\tTicks = {1}", sw.ElapsedMilliseconds, sw.ElapsedTicks);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top