String.format() против производительности конкатенации строк
есть ли разница в производительности между этими двумя идиомами?
String firstStr = "Hello ";
String secStr = "world";
String third = firstStr + secStr;
и
String firstStr = "Hello ";
String secStr = "world";
String third = String.format("%s%s",firstStr , secStr);
Я знаю, что конкатенация с оператором + плохо для производительности, особенно если операция выполняется много раз, но как насчет String.format()? это то же самое или может помочь повысить производительность?
Ответы
Ответ 1
Второй будет еще медленнее (если вы посмотрите на исходный код String.format()
, вы увидите, почему). Просто потому, что String.format()
выполняет гораздо больше кода, чем простая конкатенация. И в конце дня обе версии кода создают 3 экземпляра String
. Есть другие причины, а не связанные с производительностью, использовать String.format()
, как уже указывали другие.
Ответ 2
Прежде всего, позвольте мне просто отложить отказ от преждевременной оптимизации. Если вы не уверены, что это будет горячая точка в вашей программе, просто выберите конструкцию, которая лучше всего подходит вашей программе.
Если вы достаточно уверены, и хотите иметь хороший контроль над конкатенацией, просто используйте StringBuilder
напрямую. Это то, что делает встроенная операция конкатенации, и нет никаких оснований предполагать, что она медленная. Пока вы сохраняете один и тот же StringBuilder
и продолжаете добавлять к нему, вместо того, чтобы рисковать создавать несколько строк (которые должны быть "инициализированы" ранее созданными данными), вы будете иметь надлежащую производительность O (n), Тем более, если вы убедитесь, что инициализируете StringBuilder
с надлежащей емкостью.
Однако также сказано, что StringBuilder
- это то, что использует встроенная операция конкатенации, поэтому, если вы просто сохраняете все свои конкатенации "inline", то есть используйте A + B + C + D
, скорее чем e = A + B
, за которым следует f = C + D
, за которым следует e + f
(таким образом, тот же StringBuilder
используется и добавляется в течение всей операции) - тогда нет оснований предполагать, что это будет медленным.
EDIT: В ответ на ваш комментарий я бы сказал, что String.format
всегда медленнее. Даже если он добавляет оптимально, он не может сделать это быстрее, чем StringBuilder
(и, следовательно, также операция конкатенации), в любом случае, но он также должен создать объект Formatter
, провести синтаксический анализ входной строки и так далее на. Так что там больше, но он все еще не может выполнять основную операцию быстрее.
Кроме того, если вы смотрите внутри, как работает Formatter
, вы обнаружите, что он также (по умолчанию) использует StringBuilder
, как и операция конкатенации. Поэтому он выполняет ту же самую основную операцию, то есть кормит StringBuilder
строками, которые вы им даете. Это просто делает это гораздо более крутым способом.
Ответ 3
Как описано в этом отличном ответе, вы предпочитаете использовать String.format, но главным образом из-за проблем с локализацией.
Предположим, что вам пришлось предоставлять разные тексты для разных языков, в этом случае, используя String.format, вы можете просто подключить новые языки (используя файлы ресурсов). Но конкатенация оставляет грязный код.
Смотрите: Лучше ли использовать String.format над строкой Конкатенация в Java?