Является ли NSMutableString -appendString: метод эффективным способом создания большой строки? - PullRequest
4 голосов
/ 16 сентября 2010

Я планирую создать потенциально большую строку, перебирая коллекцию и генерируя порции за раз.Если бы я просто начал с NSMutableString и неоднократно добавлял к нему куски, это работает достаточно эффективно или это Schlemiel the Painter ситуация?Мне кажется правдоподобным, что NSMutableString реализован таким образом, чтобы этого избежать, но я не могу найти никакого обсуждения этого в официальной документации, и я хотел бы быть уверен.

(Теперь, когда я 'Записывая это, я понимаю, что в этом случае я могу создать NSArray из строк и использовать -componentsJoinedByString: так же легко, но это было бы полезно знать в любом случае.)

Ответы [ 6 ]

6 голосов
/ 17 сентября 2010

Ситуация Шлемеля сама по себе не возникает, поскольку все внутренние представления NS / CFString используют явную длину, как и все реализации в здравом уме.(Несколько измененная версия источника базовых типов CoreFoundation из OS X 10.6.2 доступна здесь .) Реальный вопрос касается затрат на распределение.

В опубликованном коде изменяемыйБуферы строк увеличиваются на 50% за раз, если они не очень велики (по крайней мере, ULONG_MAX / 3UL), давая O (log n) для перераспределений для практических сценариев.Использование подхода NSArray должно привести к одному выделению.С другой стороны, если вы строите строку по частям и освобождаете ее во время работы, вы можете получить меньше кеша / виртуальной памяти.

Таким образом, в принципе, применяется золотое правило оптимизации: если бенчмаркинг показывает проблемуна большом, но реалистичном наборе данных), попробуйте оба.

2 голосов
/ 16 сентября 2010

Я предпочитаю использовать NSArray метод componentsJoinedByString: вместо appendString, потому что он дает вам более точный контроль над тем, как выглядит строка с меньшими усилиями.

0 голосов
/ 14 июня 2014

У меня был случай, когда мне приходилось делать много вызовов NSMutableString appendString, и я могу с уверенностью сказать вам, что это УЖАСНО медленно по сравнению с просто выполнением NSString stringByAppendingString. Просто к вашему сведению.

0 голосов
/ 16 сентября 2010

Обычно я буду использовать appendString:, когда создаю меньшие строки или делаю относительно небольшое количество изменений.Если я создаю большую строку, в зависимости от ее размера, конечно, может иметь смысл создание строки из NSArray, заполненного строковыми элементами.используя appendString:.

0 голосов
/ 16 сентября 2010

Это деталь реализации.Если он реализован с помощью строки C, то у него будет проблема Schlemiel the Painter, потому что Schlemiel должен искать нулевой терминатор, чтобы знать, с чего начать рисовать больше.Если он каким-либо образом объявлен по длине, то такой проблемы не существует, потому что Шлемьель знает, как долго ему требуется шест, чтобы прыгнуть с шестом до конца струны, чтобы сделать больше рисования.Я не знаю этого (без разборки) и не могу полагаться на то, что ответ остается неизменным при всех обновлениях, поэтому вам просто нужно иметь определенную веру в то, что инженеры Apple знают, что они делают.Лучше подождать, пока что-то в вашем приложении окажется не таким быстрым, как должно быть, а затем профилировать свое приложение, чтобы узнать, что это такое.По моему опыту, фреймворк почти никогда не бывает медленным.

0 голосов
/ 16 сентября 2010

Я чаще использую NSString -stringByAppendingString: и -stringByAppendingFormat: методы.И иногда метод +stringWithFormat:.

...