stringByAppendingString: и stringWithFormat:


Я рефакторинг кода, который содержит множество строк NSString* изображение = [@"ipad_" stringByAppendingString:imageOrigName]; и спрашивает, который более оптимизирован:

stringByAppendingString:

или

stringWithFormat:

Во-первых, вы берете один NSString объект и сцепить другой на хвосте. Во втором, вы можете использовать средства форматирования:

NSString* image = [NSString stringWithFormat:@"ipad_%@", imageOrigName];

Результат тот же, но в целях оптимизации, что лучше?

Для приведенного выше примера, я бы ожидать, что простая конкатенация будет быстрее, чем его разобрать строку на '%' картинки, найдите соответствующий тип (NSString за %@), и делать все на ее фоне вуду.

Однако, что происходит, когда мы (небрежно написано?) код, который содержит несколько stringByAppendingStringы?

NSString* remainingStr = [NSString stringWithFormat:@"%d", remaining];
NSString* msg = "You have ";
msg = [msg stringByAppendingString:remainingStr];
msg = [msg stringByAppendingString:@" left to go!"];
if (remaining == 0)
    msg = [msg stringByAppendingString:@"Excellent Job!"];
else
    msg = [msg stringByAppendingString:@"Keep going!"];

Здесь, один stringWithFormat (или initWithFormat если мы используем [NSString строкой alloc]), казалось бы, разумный путь:

NSString* encouragementStr = (remaining == 0 ? @"Excellent Job!" : @"Keep going!");
NSString* msg = [NSString stringWithFormat:@"You have %d left to go! %@", remaining, encouragementStr];

Мысли? Сайты/блоги, которые вы нашли, что помогает ответить на этот вопрос?



7799
4
задан 29 ноября 2011 в 08:11 Источник Поделиться
Комментарии
2 ответа

Единственный способ узнать-измерить его.

И, конечно, единственная причина, чтобы измерить, если это действительно имеет значение; если у вас есть вопрос Реале производительности, которые могут быть отслежены с настоящим Кодексом.

Если нет, то не беспокойтесь об этом.

Однако, есть несколько вопросов для рассмотрения:


  • каждый присоеденить* собирается вызвать выделение памяти и копирование, они дорогие

  • каждый *WithFormat: вызовет анализируемая строка (и будут выделения/копирования)

  • все это, вероятно, совсем спорный, если вы делаете это 10ки тысяч раз чаще. Если вы, напрашивается вопрос, почему?

И, наконец, отметим, что такого рода манипуляции со строками собирается делать локализацию еще труднее.

4
ответ дан 29 ноября 2011 в 08:11 Источник Поделиться

Вы должны сравнить два метода, чтобы увидеть, какая быстрее. Пример:

double startTime1 = CACurrentMediaTime() / CLOCKS_PER_SEC;

NSString* testString1 = [@"fragmentOne" stringByAppendingString: @"fragmentTwo"];

double endTime1 = CACurrentMediaTime() / CLOCKS_PER_SEC;

double startTime2 = CACurrentMediaTime() / CLOCKS_PER_SEC;

NSString* testString2 = [NSString stringWithFormat: @"fragmentOne%@", @"fragmentTwo"];

double endTime2 = CACurrentMediaTime() / CLOCKS_PER_SEC;

double diff1 = (endTime1 - startTime1) * 1000000000000000;
double diff2 = (endTime2 - startTime2) * 1000000000000000;

NSLog(@"stringByAppendingString time: %f", diff1);
NSLog(@"stringWithFormat time: %f", diff2);

Я, наверное, мог бы просто запустить проверить себя в время, которое потребовалось, чтобы написать это, но все, теперь вы знаете, как эталонных методов :) если бы это был я, я бы использовать stringWithFormat , потому что он стремится сделать для более удобочитаемого кода.

Надеюсь, что это помогает!

3
ответ дан 29 ноября 2011 в 08:11 Источник Поделиться