2011-12-04 28 views
0

在我的應用程序中運行某段代碼時,我遇到了一些異常高的CPU使用率值。根據儀器,NSStringrangeOfString:方法導致此。我經常在各種for循環中使用這種方法,因爲我真的必須這樣做。rangeOfString:CPU使用率高

我的問題是:我該如何解決這個問題?儀器可以告訴我問題出在哪裏,但是這個代碼是在一個單獨的框架中,所以這是有限的。即使我知道rangeOfString:會導致它,但我不知道如何解決這個問題,以更多的CPU保留選擇。

這是導致這些問題的代碼:

- (NSArray *)resultStrings 
{ 
    NSMutableArray*_output = [[NSMutableArray alloc] init]; 
    UsageHistory*_history = [[UsageHistory alloc] init]; 
    NSHTTPCookieStorage*storage = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray*UsageHistoryArray = [[NSArray alloc] initWithArray:[_history usageHistory]]; 
    NSArray*_storageCookies = [[NSArray alloc] initWithArray:[storage cookies]]; 
    for (DAHistoryObject*object in UsageHistoryArray) 
    {  
     for (NSHTTPCookie*ck in _storageCookies) 
     { 
      @autoreleasepool 
      { 
       NSString*domain = [ck domain]; 

       if ([[[ck domain] substringToIndex:1] isEqualToString:@"."]) 
       { 
        domain = [[ck domain] stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:@""]; 
       } 
       if ([[object url] rangeOfString:domain].location != NSNotFound) 
       { 
        NSHTTPCookie*cookie = [DAHTTPCookie createCookieWithURL:[ck domain] cookieName:[ck name] expires:[[ck expiresDate] timeIntervalSince1970] cookieValue:[ck value] browserType:DARavenBrowser secure:[ck isSecure]]; 
        [_output addObject:cookie]; 
       } 
      } 
     } 
    } 

    [UsageHistoryArray release]; 
    [_storageCookies release]; 
    [_history release]; 

    return [_output autorelease]; 
} 

回答

2

條件是最優化總是妥協的聲明,在我看來,你可以從只的主機名稱部分做了測試收穫歷史網址。當你真的對主機名稱部分感興趣時,無需搜索整個url字符串 - 而當前的方法實際上可能是一個微妙的錯誤(例如,如果域名以某種方式匹配url的路徑名部分)。

if ([[[object url] host] rangeOfString:domain].location != NSNotFound) 
{ 
    NSHTTPCookie*cookie = [DAHTTPCookie createCookieWithURL:[ck domain] cookieName:[ck name] expires:[[ck expiresDate] timeIntervalSince1970] cookieValue:[ck value] browserType:DARavenBrowser secure:[ck isSecure]]; 
    [_output addObject:cookie]; 
} 

這應該已經提供了一些改進。其次,您可以嘗試僅將cookie的域名字符串與主機名稱的末尾進行匹配,但不確定添加的工作是否會提高性能。

+0

你是對的 - 優化總是妥協,很好,你的想法提供了大約5-10%的小改進,但是仍然使我成爲93%ish – Pripyat

+0

Theres still一個微妙的錯誤根據URL規範,域名不區分大小寫 – JeremyP

1

請嘗試減少工作量。

移動「的(對象...」外環你到略高於if ([[object url] rangeOfString:domain].location != NSNotFound)代碼塊。

這會阻止你調用這些字符串範圍的功能O(UsageHistoryArray * storageCookies)時間在最好的,以一個較低的O(storageCookies)。

+0

感謝您的建議,但恐怕這並不會降低CPU使用率...... – Pripyat