测量线程等待锁所花费的时间(由 coredata 锁定)
Posted
技术标签:
【中文标题】测量线程等待锁所花费的时间(由 coredata 锁定)【英文标题】:Measure time a thread spends waiting for a Lock (locking by coredata) 【发布时间】:2012-11-09 18:42:04 【问题描述】:我们在某些线程中使用 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
【问题讨论】:
【参考方案1】:我不确定 Xcode 有这个功能多久,我只在 5.1 中注意到它。在“时间分析器”仪器配置中,现在有一个复选框“记录等待线程”。在这种模式下,它会准确记录应用程序在每个方法/函数等上花费了多少时间(而不是仅仅测量 CPU 时间)。
我将采样间隔设置为 20 毫秒,否则整体会太慢。
UPD:另外,将“Sample Perspective”(在屏幕截图的左下角)设置为“Running Sample Times”以在线程刚刚从图片中空闲时丢弃样本。
【讨论】:
我只是忘记了这一点,因为直到现在我还没有一个用例——这正如描述的那样工作:) 谢谢 我在找这个但是找不到。在最新版本的 Xcode 中,您现在可以使用“录制选项”(或按住选项键同时按下录制按钮)找到设置。【参考方案2】:使用 Instruments 中的“系统调用”工具。如果您在启动 Instruments 时选择“系统跟踪”模板,您将获得此仪器。这将为您提供各种日程安排信息,让您找到答案。
【讨论】:
请重读……但也许我放弃了 :D 似乎没有一个“好”的方法【参考方案3】:我最近遇到了一个问题,即我的应用因 CoreData 上下文过多而挂起。我通过使用 @synchronized 关键字包装代码来修复它,如下所示:
NSManagedObjectContext *context = [[DataStore sharedStore] managedObjectContext];
@synchronized(context)
... do some database stuff
DataStore 是我的单例,它返回一个上下文。显然该应用程序现在运行速度有点慢,但我稍后会对其进行优化。如果有人抱怨,我会说“你宁愿有一个稍微慢一点的应用程序还是一个经常崩溃的应用程序?”。我的理念始终是“让它发挥作用,然后让它变得更快”。
【讨论】:
我同意,虽然这不是问题;)以上是关于测量线程等待锁所花费的时间(由 coredata 锁定)的主要内容,如果未能解决你的问题,请参考以下文章