2012-11-09 28 views
2

我們在某些線程使用coredata ......(太多的併發環境不好 - 我知道,我體驗吧)測量時間一個線程用於等待一個鎖(由coredata卡死)

現在周圍的每一個取/ save coredata包裝一個鎖。

我現在想衡量一個線程花費被阻塞等待將收購該鎖的時間。


我以爲我可以只使用時間分析器甚至線程狀態工具或採樣器。 但: - 時間分析器會忽略等待(可能是因爲它不是一個CPU調用) - 採樣以及(即使他isntin 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 

回答

5

我不知道長的Xcode怎麼有這個功能,我只注意到它在5.1。在「Time Profiler」儀器配置中,現在有一個複選框「記錄等待線程」。在這種模式下,它會記錄應用程序花在每個方法/函數等上的精確時間(而不是僅測量CPU時間)。

enter image description here

我設置採樣間隔20毫秒,否則整體將是太慢了。

UPD:還設置「樣本透視」(在截圖左下角)「運行樣品時報」放棄樣本時,線程是從圖片只不過是無聊的。

+0

。對我來說是新的。生病後再看看:)謝謝! –

+0

我只是忘記了這一點,因爲直到現在我還沒有這樣的用例 - 這是按照描述的方式工作:)謝謝 –

0

使用在儀器的「系統調用」的工具。如果在啓動儀器時選擇「系統跟蹤」模板,則會獲得此儀器。這會給你各種日程安排信息,讓你找到答案。

+0

請重讀......但也許我放棄了:D似乎沒有冷靜一個「好」的方式 –

0

最近,我在我的應用程序被掛,因爲太多CoreData環境的問題。我固定它通過只包裝的代碼,像這樣的@Synchronized關鍵字:

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

數據存儲是我的單身返回的上下文。顯然,該應用現在運行速度稍慢,但稍後我會對其進行優化。如果有人抱怨,我會說「你願意有一個稍微慢一點的應用程序或一個崩潰了很多的應用程序?」。我的理念永遠是「讓它工作,然後讓它快速」。

+0

我同意,雖然這不是問題;) –