簡體   English   中英

rangeOfString:高CPU使用率

[英]rangeOfString: high CPU usage

在我的應用程序中運行某些代碼時,我遇到一些異常高的CPU使用率值。 根據Instruments, NSStringrangeOfString:方法導致此情況。 我確實非常頻繁地在各種for循環中使用此方法。

我的問題是:我該如何解決? 儀器可以告訴我問題所在,但是該代碼位於單獨的框架中,因此受到限制。 即使我知道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];
}

有了優化始終是折衷的免責聲明,在我看來,僅對歷史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];
}

這應該已經提供了一些改進。

其次,您可以嘗試將Cookie的域字符串與主機名的末尾進行匹配,但是不確定這樣做是否會提高性能。

嘗試減少工作量。

將“ for(object ...”)外循環移到if ([[object url] rangeOfString:domain].location != NSNotFound)代碼塊的if ([[object url] rangeOfString:domain].location != NSNotFound)

這將阻止您最多將這些字符串范圍函數調用O(UsageHistoryArray * storageCookies)一次,將其調用到一個較低的O(storageCookies)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM