코드 속도를 테스트하시나요?
-
02-07-2019 - |
문제
저는 완전히 초보자이지만 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 기반 애플리케이션의 경우)를 반복적으로 수행하여 처리량에 대한 핫스팟을 식별할 수도 있습니다.
프로파일러를 사용하세요.
- 개미(http://www.red-gate.com/Products/ants_profiler/index.htm)
- 도트트레이스(http://www.jetbrains.com/profiler/)
특정 방법 하나만 시간을 측정해야 하는 경우 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);