2011-12-04 11 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文字列全体を検索する必要はありません。現在の方法は実際には微妙なバグかもしれません(ドメイン名が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]; 
} 

これは、既に改善が必要です。

第2に、ホスト名の末尾にクッキーのドメイン文字列をマッチさせることができますが、その追加作業によってパフォーマンスが向上するかどうかはわかりません。

+0

あなたは右の最適化が常に妥協であり、それはうまくいきました。あなたのアイデアは約5〜10%のマイナーな改善を提供しますが、それでも私は93%のアイディアになります。 – Pripyat

+0

Theresまだドメインは大文字と小文字を区別しません。 – JeremyP

1

代わりに作業を減らしてください。

移動外側のループ「(オブジェクト...のために」あなただけif ([[object url] rangeOfString:domain].location != NSNotFound)コードブロック以上に持っている。

これは、これらの文字列の範囲の関数O(UsageHistoryArray * storageCookies)の回で最高のを呼び出して、あなたを停止します

+0

提案していただきありがとうございますが、これはCPU使用率を下げることはないと思います... – Pripyat