【问题标题】:rangeOfString: high CPU usagerangeOfString: 高 CPU 使用率
【发布时间】:2011-12-04 10:52:59
【问题描述】:

在我的应用程序中运行某段代码时,我遇到了一些异常高的 CPU 使用率值。根据 Instruments,NSString 的 rangeOfString: 方法会导致这种情况。我确实经常在各种for 循环中使用这种方法,因为我真的必须这样做。

我的问题是:我该如何解决这个问题? Instruments 可以告诉我问题出在哪里,但是这段代码在一个单独的框架中,所以这是有限的。尽管我知道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];
}

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    由于优化总是妥协的免责声明,在我看来,您可以通过仅对历史 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 的域字符串与主机名的末尾进行匹配,但不确定为此添加的工作是否会提高性能。

    【讨论】:

    • 你是对的——优化总是妥协,说得好。你的想法提供了大约 5 - 10% 的小幅改进,但这仍然让我达到了 93% 的水平。
    • 还有一个微妙的错误。根据 URL 规范,域不区分大小写。
    【解决方案2】:

    试着做更少的工作。

    将“for(object...”) 外部循环移到 if ([[object url] rangeOfString:domain].location != NSNotFound) 代码块的正上方。

    这将阻止您调用那些字符串范围函数 O(UsageHistoryArray * storageCookies) 次,最多可以调用较低的 O(storageCookies)。

    【讨论】:

    • 感谢您的建议,但恐怕这也不会降低 CPU 使用率...
    猜你喜欢
    • 2021-12-09
    • 2014-07-16
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多