2

一部のスレッドでcoredataを使用しています...(同時コンテキストが多すぎると悪いです-私は知っています、私はそれを経験します)

これで、すべてのフェッチ/保存コアデータがロックをラップします。

ここで、1つのスレッドがそのロックを取得するのを待ってブロックされるのに費やす時間を測定したいと思います。


タイムプロファイラー、スレッドステートインストゥルメント、サンプラーを使用できると思いました。しかし:-タイムプロファイラーは待機を無視します(おそらくCPU呼び出しではないため)-サンプラーも(CPUモードではありませんが)-スレッドはインストルメントが正しいコールスタックを表示しないと述べています:([しかし多分(そしてそれは常に可能性)私は簡単な解決策を見落としていました]


ここに、ロックもあり、待機時間も取得できない非常に単純なアプリがあります...この例では、メインスレッドが待機する時間を取得するのに役立つかもしれません-いくつかのプロファイリング手法を使用して次に、coredataケースに転送します。

@implementation DDAppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    NSLock *l = [[NSLock alloc] init];
    NSLog(@"made");
    [NSThread detachNewThreadSelector:@selector(hogTheLog:) toTarget:self withObject:l];
    NSLog(@"wait");
    [l lock];
    NSLog(@"got");
    [l unlock];
    NSLog(@"terminate");
    [NSApp terminate:nil];
}

- (void)hogTheLog:(NSLock*)l {
    [l lock];
    sleep(3);
    [l unlock];
}
@end
4

3 に答える 3

6

Xcode にこの機能がどのくらいの期間備わっているかはわかりませんが、5.1 で初めて気付きました。"Time Profiler" インストゥルメント構成に、"Record Waiting Threads" チェックボックスが追加されました。このモードでは、アプリケーションが各メソッド/関数などに費やした時間を正確に記録します (CPU 時間だけを測定するのではなく)。

ここに画像の説明を入力

サンプル間隔を 20 ミリ秒に設定しました。そうしないと全体的に遅くなりすぎるためです。

UPD: また、「Sample Perspective」(スクリーンショットの左下隅) を「Running Sample Times」に設定して、スレッドが画像からアイドル状態になったときにサンプルを破棄します。

于 2014-03-20T11:42:38.000 に答える
1

Instrumentsで「システムコール」インストゥルメントを使用します。このインストゥルメントは、Instruments の起動時に「システム トレース」テンプレートを選択すると取得されます。これにより、あらゆる種類のスケジュール情報が得られ、答えを見つけることができます.

于 2013-03-14T14:17:43.137 に答える