2

我们在某些线程中使用 coredata ......(太多并发上下文不好 - 我知道,我经历过)

现在围绕每个获取/保存核心数据包装一个锁。

我现在想测量一个线程在等待获取该锁时被阻塞所花费的时间。


我想我可以只使用时间分析器甚至线程状态仪器或采样器。但是: - 时间分析器只是忽略等待(可能是因为它不是 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 中注意到它。在“时间分析器”仪器配置中,现在有一个复选框“记录等待线程”。在这种模式下,它会记录应用程序在每个方法/函数等上花费了多少时间(而不是仅仅测量 CPU 时间)。

在此处输入图像描述

我将采样间隔设置为 20 毫秒,否则整体会太慢。

UPD:另外,将“Sample Perspective”(在屏幕截图的左下角)设置为“Running Sample Times”以在线程刚刚从图片中空闲时丢弃样本。

于 2014-03-20T11:42:38.000 回答
1

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

于 2013-03-14T14:17:43.137 回答
0

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

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

DataStore 是我的单例,它返回一个上下文。显然该应用程序现在运行速度有点慢,但我稍后会对其进行优化。如果有人抱怨,我会说“你宁愿有一个稍微慢一点的应用程序还是一个经常崩溃的应用程序?”。我的理念始终是“让它发挥作用,然后让它变得更快”。

于 2014-10-10T19:07:16.077 回答