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

时间:2012-11-09 18:42:05

标签: objective-c xcode core-data 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

3 个答案:

答案 0 :(得分:6)

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

enter image description here

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

UPD:同时,设置" Sample Perspective" (在屏幕截图的左下角)到"运行采样时间"当线程从图片中空闲时丢弃样本。

答案 1 :(得分:0)

使用仪器中的“系统调用”仪器。如果在启动仪器时选择“系统跟踪”模板,则会获得此仪器。这将为您提供各种日程安排信息,以便您找到答案。

答案 2 :(得分:0)

我最近有一个问题,我的应用程序因为CoreData上下文过多而挂起。我通过使用@synchronized关键字包装代码来修复它,如下所示:

NSManagedObjectContext *context = [[DataStore sharedStore] managedObjectContext];
@synchronized(context) {
   ... do some database stuff
}

DataStore是我的单例,它返回一个上下文。显然,应用程序现在运行速度稍慢,但我稍后会对其进行优化。如果有人抱怨,我会说"你宁愿有一个稍慢的应用程序或一个崩溃很多的应用程序?"。我的理念始终是"让它发挥作用然后快速做到#34;。