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、ますます大きくなるにつれてパフォーマンスの問題が発生しますか? これは、シュレミエル・ザ・ペインターのアルゴリズムと同様の非効率性に悩まされるようです。

もしそうなら、私の素朴な実装を改善するために何ができますか? に使用NSMutableStringself.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 に答える