Строка оптимизации Java против массивов символов - PullRequest
11 голосов
/ 07 мая 2010

В программе, которую я пишу, я выполняю много манипуляций со строками. Я пытаюсь увеличить производительность и задаюсь вопросом, покажет ли использование массивов символов приличное увеличение производительности. Есть предложения?

Ответы [ 5 ]

7 голосов
/ 07 мая 2010

Какие манипуляции вы делаете? Можете ли вы опубликовать пример кода?

Возможно, вы захотите взглянуть на StringBuilder , который реализует CharSequence для повышения производительности. Я не уверен, что ты хочешь сделать свою собственную. StringBuilder не безопасен для потоков, кстати ... если вы хотите обеспечить безопасность потоков, посмотрите StringBuffer .

2 голосов
/ 07 мая 2010

Профилировали ли вы свою заявку? Вы знаете, где находятся узкие места? Это первый шаг, если производительность ниже номинальной. Ну, это и определение приемлемых показателей производительности.

После того, как вы профилировали выполнение некоторых задач, у вас будет процент времени, потраченного на выполнение задач. Если вы тратите много времени на манипуляции со строками, может быть, вы можете начать кэшировать некоторые из этих манипуляций? Делаете ли вы некоторые из них несколько раз, когда достаточно выполнить их один раз (а затем использовать этот результат позже, когда это необходимо)? Вы копируете строки, когда вам это не нужно? Помните, java.lang.String является неизменным, поэтому его нельзя изменить напрямую.

Я обнаружил, что при оптимизации / настройке производительности системы, над которой я работаю, несколько раз я не знаю, откуда инстинктивно возникает медлительность. Я видел, как другие (и, к сожалению, я) проводили дни, оптимизируя что-то, что не дает никакой выгоды - потому что это не было первоначальным узким местом, и фактически было потрачено менее 1% времени.

Надеюсь, это поможет вам в правильном направлении.

2 голосов
/ 07 мая 2010

Вот выдержка из полного источника класса String из JDK 6.0:

 public final class String implements  java.io.Serializable,
       Comparable<String>, CharSequence {
       /** The value is used for character storage. */
        private final char value[];

       /** The offset is the first index of the storage that is used. */
       private final int offset;

        /** The count is the number of characters in the String. */
       private final int count;

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

Как предлагалось ранее, имеет смысл использовать StringBuilder или StringBuffer для большинства операций со строками.

На самом деле следующий код:

   String a = "a";
   a=a+"b";
   a=a+"c";

Когда скомпилированный файл будет автоматически преобразован в StringBuilder, это можно легко проверить с помощью javap .

Как правило, редко рекомендуется тратить время на попытки улучшить производительность основных классов Java, если только вы не являетесь экспертом мирового уровня, просто потому, что этот код был написан экспертами мирового уровня.во-первых.

2 голосов
/ 07 мая 2010

Строка уже реализована как массив символов. Что вы планируете делать по-другому? В любом случае, между этим и фактом, что GC для эфемерных объектов чрезвычайно быстр, я был бы удивлен, если бы вы могли найти способ повысить производительность, заменив массивы символов.

Совет Майкла Боргвардта о небольших массивах символов и использовании StringBuilder и StringBuffer очень хорош. Но для меня главное - постараться не догадываться о том, что происходит медленно: проводить измерения, использовать профилировщик, получать определенные факты. Потому что обычно наши предположения о производительности оказываются неверными.

1 голос
/ 07 мая 2010

Если у вас очень большое количество коротких строк, вместо этого можно использовать char[], что может сэкономить немало памяти, что также означает большую скорость из-за меньшего количества кешей.

Но при работе с большими строками главное, на что нужно обращать внимание, - это избегать ненужного копирования, что приводит к неизменности String. Если вы делаете много конкатенации или замены, использование StringBuilder может иметь большое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...