如果我提出以下问题。初始化NSMutableString类的最佳方法是什么? (所有实例都将在意外时间返回...所以我假设初始化如下:)
如果我事先知道工作量。 (预期)
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];
}
如果我事先不知道工作量。 (意外)
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];
}
执行这些任务时大致分成两部分,初始化的最佳方法是什么?
我有时在处理这些任务时也会感到困惑。
答案 0 :(得分:13)
案例1
在列出的选项中,我使用:
NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
...如果您知道目的地大小,或者在顶部有一个小房间估算它,并且能够快速确定确切的大小,或者最坏情况下的大小,这可以节省多个重新分配和复制操作。如果您在最坏的情况下不知道大小,或者计算时需要花费大量时间,那么您也可以使用[NSMutableString string]
或[NSMutableString new]
。此外,*WithCapacity
是一个提示,框架可以自由忽略。
当然,你的循环体和你预留的大小也意味着所有的值都是[0 ... 9](具体来说,所有的值都消耗一个字符),在这种情况下,你可以做得更好使用带有更多参数的格式字符串但是,对于大多数迭代,i
显然大于9,并且每个迭代平均消耗3个字符,因此对于您发布的确切代码,3000将是更合适的预留容量。
案例2
在列出的选项中,我使用:
NSMutableString *str4 = [NSMutableString string];
更好的是,如果您不需要将其添加到自动释放池:[NSMutableString new]
或[[NSMutableString alloc] init]
。
其他笔记
是的,将对象保留在自动释放池之外(例如,使用alloc + init)可以显着提高性能并降低峰值内存使用量。有时,这超出了您的控制范围,在某些环境(例如ARC)中,即使您使用自动释放的便利构造函数,也可能会发生这种情况,例如: [NSMutableString string]
。
更快的解决方案
最后,如果你概述的这种情况确实是一个性能问题,最快的方法是在堆栈上创建一个char
缓冲区,然后从复制数字的结果中创建一个NSString
到char
缓冲区。假设你的int
都是0-9,它将非常快速和简单,然后只需从(终止的)cstring创建一个NSString
。如果输入大小变化,或者非常大(导致字符串很长),您甚至可以这样做。
答案 1 :(得分:10)
如果你已经对你的程序进行了优化,以至于这个决定会对其整体表现产生可测量的影响,那就拍拍自己,或者像BBT的Sheldon所说的那样,“吃巧克力!”
PS:
如果你准确地知道前面的大小或对它有一个非常好的估计,那么在stringWithCapacity:
或initWithCapacity:
中使用该大小,如果你不这样做,那么甚至不要打扰 - 让框架决定,it's pretty damn clever!
答案 2 :(得分:3)
这是最简短的方法:
NSMutableString *string = [@"" mutableCopy];
答案 3 :(得分:1)
NSMutableString *str1 = [NSMutableString stringWithString:@""];
糟糕,NSString(@&#34;&#34;)被毫无意义地创建,然后被复制到新的NSMutable String
NSMutableString *str2 = [NSMutableString stringWithCapacity:0];
不好,一个容量为0的NSMutableString需要在第一次添加时膨胀。
NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
好,如果1000具有一定的意义(即它是您正在使用的内容的预期大小)。
NSMutableString *str4 = [NSMutableString string];
很好,使用便捷方法,就像做[NSMutableString alloc] init];
答案 4 :(得分:0)
如果您事先知道尺寸,请使用
[NSMutableString stringWithCapacity: _Known_Size_];
如果您事先不知道尺寸,请使用
[NSMutableString stringWithCapacity: _small_number_];
然后可变字符串将根据需要增长。
答案 5 :(得分:-2)
分配和初始化对象总是更好,而不是使用类方法来创建它(将它放在最近的自动释放池中)。
所以,
NSMutableString* stringOne = [[NSMutableString alloc] initWithCapacity:capacity];
而不是
NSMutableString* stringTwo = [NSMutableString stringWithCapacity:capacity];
请记住,完成后必须释放stringOne,而不是stringTwo,因为stringWithCapacity:class方法返回一个自动释放的对象。
在此处详细了解该主题:http://www.mulle-kybernetik.com/artikel/Optimization/opti-5.html