[英]rangeOfString: high CPU usage
在我的應用程序中運行某些代碼時,我遇到一些異常高的CPU使用率值。 根據Instruments, NSString
的rangeOfString:
方法導致此情況。 我確實非常頻繁地在各種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.