문제

목표 C 응용 프로그램에 자동화 된 성능 테스트를 추가하고 싶습니다. (이것은 단순히 일련의 테스트를 실행하여 엔진의 주요 부분의 현재 성능을보고 싶습니다.) 이렇게하려면 타이밍 지원 루틴을 작성하고 싶습니다.

- (void) benchmarkSelector: (SEL) msg onObject: (id) target
{
    // run the selector thousands of times, print detailed stats
}

문제는 밀리 초에 관심이 있고 performSelector 벤치마킹 코드에서 결과는 결과를 꽤 비뚤어집니다. 이걸 어떻게 갈 건가요? 내려 가야할까요? objc_msgSend?

도움이 되었습니까?

해결책

사용 methodForSelector:, 함수 포인터를 실제 구현에 반환합니다.

IMP methodImp = [target methodForSelector:msg];
for (int i=0; i<1000; ++i) {
    NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
    methodImp(target, msg);

    NSTimeInterval duration = [NSDate timeIntervalSinceReferenceDate] - start;
    // Do something with duration
}

이 전략은 메소드의 실제 런타임을 측정하는 데 유용하지만 표준 Objective-C 메시지 통과 구문으로 호출하려는 경우 메시지 전달 오버 헤드를 포함시키는 것과 마찬가지로 관련이있을 수 있습니다. 당신의 측정.

또한 메소드가 실제로 다른 매개 변수를 가져 오면 결과를 시전해야합니다. methodForSelector: 적절한 매개 변수가있는 함수 포인터에 플로트를 두 배로 전환하는 것을 피하기 위해 nsObject 클래스 참조 자세한 정보 및 예를 보려면.

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