2010-01-19 1 views
3

나는 PostSharp에서 아주 좋은 성능 동작을 발견했습니다. 작은 프로그램을 작성한 속도를 평가하면 지정된 횟수만큼 하나의 함수가 실행되고, PostSharp가 활성화되어 있으면 메모리에있는 수백 개의 문자열을 생성하고 삭제할 수 있습니다 (고정되지 않은 구성이므로 자동 - 인턴). 루프는 평범하지 않은 (수 밀리 초) 시간 동안 실행됩니다.PostSharp는 속도에 아무런 영향을 미치지 않습니다.

이제 몇 백만 번의 실행에서 차이를 측정 할 수 없으며 동일한 호출 횟수를 처리하는 비 PostSharp 버전과 비교하여 불과 수 나노초의 차이에 해당하는 40 억 회의 반복이 발생했습니다. 나에게 이것은 불가능하다. 내 시험에 문제가있을 것입니다. 나는 동료들에 의해 동료들에 의해 검토 된 코드를 가지고 있었기 때문에 코드가 내가 의도 한대로 코드를 수행 할 것이라고 확신한다.

따라서 벤치 마크를위한 느리게 실행되는 시뮬레이션과 같이 문자열 생성 (의도 된 응용 프로그램에서 예상되는 사용)을 사용하면 문제가 있습니까?

또는 다른 누군가가 PostSharp의 런타임 성능 분석을 수행했거나 알고 있습니까?

감사합니다.

+2

다른 사람들이 귀하의 해석 대신 실제 코드와 사실을 처리 할 수 ​​있도록 문제를 보여주는 짧지 만 완전한 프로그램을 게시하십시오. PostSharp가 추가 할 실제 코드 외에도 모든 메소드에 약간의 코드를 추가하기 때문에 테스트에서 이상한 점이있을 것이라고 확신합니다. 런타임에 아무런 영향을 미치지 않을 것 같지 않습니다. –

답변

1

3GHz 프로세서에서 40 억 클럭 사이클만으로도 13 초가 걸릴 것이며, 한 번의 반복으로 단 하나의 클록 사이클 만 걸리는 것을 진심으로 의심합니다. 시험에 뭔가 잘못되었습니다.

뭔가가 최적화 될 가능성이 있습니다. 어쩌면 똑같은 일을 계속 반복하고 있으며, 처음부터 제외하고 전혀하지 않기로 결정했을 것입니다. 퍼프 분석을 할 때 데이터를 무작위로 추출해야합니다.

+0

내가 말했듯이, 줄은 고정되어 있지 않습니다. 여기에는 난수가 포함됩니다. 또한 VS의 디버그 빌드는 아무 것도 최적화하지 않습니다. 그들은이 방법으로 매우 멍청하기 때문에 일관성을위한 좋은 참고 자료입니다. –

+0

@Alex : 테스트 코드의 골격을 포함해야 할 수도 있습니다. 세부 사항이 없다면, 나는 nobugz와 내가 말할 수있는만큼 많이 말했다고 생각한다. 40 억 번의 반복 작업을위한 몇 ms의 실행 시간은 불가능합니다. 테스트 사이의 델타 수만큼의 차이입니다. – Aaronaught

+0

한 가지 더 - 전체 (400 억) 테스트를 실행하는 데 얼마나 걸립니까? * 여러 번 실행하면 몇 분 이상 걸릴 가능성이 큽니다. 그보다 더 빠른 속도로 진행된다면 아마도 여러 번 실행되지 않을 것입니다. – Aaronaught

1

성능 테스트를 수행했습니다. 그들은 PostSharp Blog

과 같은 기능을 사용할 수 있습니다 : 반사, 메서드 매개 변수에 대한 액세스, 메서드 인스턴스에 대한 액세스와 같은 기능을 사용하지 않는 경우 일부 기능은 손으로 작성한 코드와 동일한 성능을 가질 수 있습니다. PostSharp가 MSIL 명령어를 방출하기 때문에 생성 된 코드는 JIT 컴파일러에 의해 인라인 될 수 있습니다.

다른 답변에서 언급했듯이 (1) PostSharp가 실제로 호출되고 (결과 어셈블리에서 반사경 사용) (2) 스톱워치를 올바르게 사용하고 있는지 확인하십시오. 단일 테스트의 평균 시간을 비교하는 경우, PostSharp와 손으로 쓴 코드의 차이는 불과 몇 나노초 (고가의 기능을 사용하지 않는다는 가설)입니다.

-gael

0

당신이 테스트를 변경할 수, 생성 된 문자열 그런 다음 반복 (문자열 길이 콘솔에 기록) 또는 무언가에 사용되도록? 아마도 컴파일러는 postsharp 함수가 전혀 실행되지 않거나 비동기 적으로 호출되거나 다른 CPU에서 실행되는 방식으로 프로그램을 최적화합니다. 다른 반복과 동기화 할 이유가 없기 때문일 수 있습니다. 더 단단히 링크하면 컴파일러가 강제로 작업을 동기화 할 수 있습니다.