测量线程等待锁定所花费的时间(通过coredata锁定)

Dai*_*jan 2 xcode core-data objective-c instruments

我们在某些线程中使用coredata ...(太多的并发上下文都很糟糕 - 我知道,我经历过它)

现在围绕每个获取/保存coredata包装锁.

我现在想测量一个线程等待获取锁定所花费的时间.


我以为我可以使用时间分析器甚至是线程状态仪器或采样器.但是: - 时间分析器只是忽略等待(可能是因为它不是CPU调用) - 采样器(即使他不是cpu模式) - 线程状态仪器也没有显示我正确的callstack :( [但也许(并且这总是一个)可能)我忽略了一个简单的解决方案]


在这里我有一个非常简单的应用程序,也有一个锁,我也没有得到等待时间...也许你可以帮助我得到主线程在这个例子中等待的时间 - 使用一些分析技术我可以然后转移到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
Run Code Online (Sandbox Code Playgroud)

小智 6

我不确定Xcode有多长时间有这个功能,我只在5.1中注意到它.在"Time Profiler"仪器配置中,现在有一个复选框"Record Waiting Threads".在此模式下,它记录应用程序在每个方法/功能上花费的确切时间等(而不是仅测量CPU时间).

在此输入图像描述

我将采样间隔设置为20 ms,否则总体上会太慢.

UPD:同样,将"Sample Perspective"(在屏幕截图的左下角)设置为"Running Sample Times"以在线程从图片中空闲时丢弃样本.