質問

Objective-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:の結果を適切なパラメーターを使用して関数ポインターにキャストし、floatからdoubleなどへの予期しない変換を回避する必要があることに注意してください NSObjectクラスリファレンスを参照してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top