测量线程等待锁所花费的时间(由 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 锁定)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C 中测量每个线程的时间?

vc如何创建 线程池

有没有一种简单的方法来判断等待 Python GIL 花费了多少时间?

C:在多线程程序中使用clock()测量时间

java多线程如何互锁

设置线程池大小 · 贰白