初始化NSMutableString对象的最佳方法是什么?

bit*_*com 15 iphone objective-c nsstring nsmutablestring

如果我提出以下问题.初始化NSMutableString类的最佳方法是什么?(所有实例都将在意外时间返回...所以我假设初始化如下:)

  1. 如果我事先知道工作量.(预期)

    NSMutableString *str1 = [NSMutableString stringWithString:@""];
    NSMutableString *str2 = [NSMutableString stringWithCapacity:0];
    NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
    NSMutableString *str4 = [NSMutableString string];
    
    for(int i = 0; i< 1000; i++)
    {
        //The following tasks.(Adding to the string to continue working.)
        [/*str1~str4*/ appendFormat:@"%d", i];
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果我事先不知道工作量.(意外)

    NSMutableString *str1 = [NSMutableString stringWithString:@""];
    NSMutableString *str2 = [NSMutableString stringWithCapacity:0];
    NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
    NSMutableString *str4 = [NSMutableString string];
    
    for(int i = 0; i< /*a large of size(unpredictable)*/ ; i++)
    {
        //The following tasks.(Adding to the string to continue working.)
        [/*str1~str4*/ appendFormat:@"%d", i];
    }
    
    Run Code Online (Sandbox Code Playgroud)

执行这些任务时大部分分为两部分,初始化的最佳方法是什么?

我有时候在处理这些任务时也会感到困惑.

jus*_*tin 13

情况1

在列出的选项中,我使用:

NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
Run Code Online (Sandbox Code Playgroud)

...如果您知道目的地大小,或者在顶部有一个小房间估算它并且能够快速确定确切的大小,或者最坏情况的大小,这可以节省多个重新分配和复制操作.如果您不知道最坏情况下的大小,或者计算时需要花费大量时间,那么您也可以使用[NSMutableString string][NSMutableString new].此外,*WithCapacity还有一个提示,框架可以自由忽略.

当然,你的循环体和你保留的大小也暗示所有的值都是[0 ... 9](具体来说,所有值都消耗一个字符),在这种情况下你可以通过使用格式字符串做得更好有更多的论点.但是,i对于大多数迭代而言,显然大于9,并且每个迭代将平均消耗3个字符,因此对于您发布的确切代码,3000将是更合适的保留容量.

案例2

在列出的选项中,我使用:

NSMutableString *str4 = [NSMutableString string];
Run Code Online (Sandbox Code Playgroud)

更好的是,如果您不需要将其添加到自动释放池中:[NSMutableString new][[NSMutableString alloc] init].

其他说明

是的,将对象保留在自动释放池之外(例如,使用alloc + init)可以显着提高性能并减少峰值内存使用.有时,这是您无法控制的,在某些环境(例如ARC)中,即使您使用自动释放的便利构造函数,也可能会发生这种情况 - 例如[NSMutableString string].

更快的解决方案

最后,如果您认为这种情况确实是性能问题,最快的方法是char在堆栈上创建一个缓冲区,然后NSString从将数字复制到char缓冲区的结果中创建一个缓冲区.假设你的ints都是0-9,它将非常快速和简单,然后只需NSString从(终止的)cstring 创建一个.如果输入大小变化,或者非常大(导致字符串很长),您甚至可以这样做.


dan*_*dee 10

这并不重要.

如果你已经优化了你的程序到目前为止这个决定会对它的整体表现产生可测量的影响,那就拍拍自己,或者像BBT的Sheldon所说的那样,"吃巧克力!"

PS:
如果你确切地知道前面的尺寸或对它有一个非常好的估计,那么使用那个尺寸,stringWithCapacity:或者initWithCapacity:如果你不这样做,那么甚至不要打扰 - 让框架决定,它非常聪明!