在我的应用程序中运行某段代码时,我遇到了一些异常高的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];
}
答案 0 :(得分:2)
由于免责声明优化总是妥协,在我看来,您只能在历史记录网址的主机名部分进行测试。当你真的只对主机名部分感兴趣时,不需要搜索整个url字符串 - 并且当前的方法实际上可能是一个微妙的错误(例如,如果域名以某种方式匹配url的路径名部分)。 / p>
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的域字符串与主机名的末尾进行匹配,但不确定添加的工作是否会提高性能。
答案 1 :(得分:1)
尝试减少工作量。
将“for(object ...”外部循环移动到if ([[object url] rangeOfString:domain].location != NSNotFound)
代码块的正上方。
这将阻止你最多调用那些字符串范围函数O(UsageHistoryArray * storageCookies)次数到更低的O(storageCookies)。