2

我有一些这样的代码:

-(void)updateString: (NSString*)str {
     self.buffer = [self.buffer stringByAppendingString:str];
     self.string = [self.buffer stringByAppendingString:@"Always at the end of self.string"];
}

输入:

self.buffer: "blah\n"
self.string: "Always at the end of self.string"
str: "Hello\n"

输出:

self.buffer: "blah\nHello\n"
self.string: "blah\nHello\nAlways at the end of self.string"

如果updateString被频繁调用,是否会随着self.buffer越来越大而导致性能问题?看起来这将遭受类似于Schlemiel the Painter 算法的低效率。

如果是这样,我能做些什么来改进我的幼稚实现?用于?NSMutableString_self.buffer

4

2 回答 2

1

NSMutableString 对于大字符串会更有效,因为它不需要每次都复制数据。

您应该使用仪器进行分析,看看会发生什么。当您在仪器中的 CPU 优化命中列表的顶部看到 updateString 时,请先画掉,然后再担心这个问题。
此外,如果没有分析,很难预测需要优化的地方。例如,如果 updateString 被调用的次数比 self.string 多得多,你可以这样优化:

//assuming NSMutableString *buffer;

- (void)updateString:(NSString *)string {
    [self.buffer appendString:string];
}

- (NSString *)string {
    return [self.buffer stringByAppendingString:@"Always at the end of self.string"];
}
于 2013-01-07T09:51:36.467 回答
0

你甚至需要单独buffer的和string属性吗?您可以只使用一个NSMutableString,并在附加更多文本时覆盖“始终在末尾”部分吗?

- (void)updateStringWithString:(NSString *)moreText {
    static NSString *const tail = @"Always at the end";
    NSRange rangeToReplace = NSMakeRange(self.string.length - tail.length, tail.length);
    [self.string replaceCharactersInRange:rangeToReplace withString:moreText];
    [self.string appendString:tail];
}
于 2013-01-07T08:12:54.750 回答