一部のスレッドで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