2013-01-07 22 views
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's algorithm的效率低下。

如果是這樣,我該怎麼做才能提高我的天真實施?使用NSMutableString代替self.buffer

+0

NSMutableString是要走的路。簡單而高效,並且可以說不是「過早優化」,因爲它在一些情況下比非可變字符串方法更簡單。 –

回答

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"]; 
} 
0

你甚至需要單獨的bufferstring屬性嗎?你可以只使用一個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]; 
} 
相關問題