rangeOfString:高CPU使用率

时间:2011-12-04 10:52:59

标签: objective-c cocoa

在我的应用程序中运行某段代码时,我遇到了一些异常高的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];
}

2 个答案:

答案 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)。