Струны и производительность - PullRequest
3 голосов
/ 19 октября 2011

У меня есть цикл for, подобный этому:

    String myString = "123456789";
    String prefix = null;
    for (int i=6;i>=0;--i)
    {
       prefix = myString.substring(0,i);
       process(prefix);
    }

Проблема в том, что если этот блок кода будет выполнен N раз, будет создано N * 7 строк (7 строк будут созданы для каждого выполнения - потому что метод подстроки создает новую строку, и этот метод вызывается 7 раз для каждое исполнение). Я думаю о том, как улучшить производительность в этом случае. Я хотел знать, есть ли способ использовать только одну строку для каждого выполнения, причем каждый раз это модифицируется. Это цель StringBuilder, но я думаю, что StringBuilder в этом случае не поможет:

    String myString = "123456789";
    StringBuilder prefix = new StringBuilder(myString);
    for (int i=6;i>=0;--i)
    {
       prefix.delete(i,prefix.length());
       process(prefix.toString());
    }

В этом случае префикс всегда ссылается на один и тот же объект StringBuilder, но та же проблема возникает в другом месте, потому что prefix.toString () всегда возвращает новый объект String.

Есть идеи?

(Я знаю, что тема была рассмотрена много раз. Но я провел некоторый поиск и не нашел решения, может быть, это минимальное использование памяти?)

Спасибо за вашу помощь

Ответы [ 5 ]

6 голосов
/ 19 октября 2011

Несмотря на то, что myString.substring(0, i) создает новый объект String, обратите внимание, что это не копирует базовые символьные данные.

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

1 голос
/ 19 октября 2011

Что вы подразумеваете под использованием памяти?

Если вы используете второй метод, будет создана новая строка yes, но сборщик мусора Java удалит строку из памяти, как только метод будет удаленстек вызовов (т. е. метод завершен).Таким образом, в любой момент времени у вас будет только 2 строки - исходная строка и строка префикса.

1 голос
/ 19 октября 2011

Какова цель этого?

Вы правы, в вашем цикле создано 7 экземпляров строки, но поскольку строки неизменяемы, все они не хранят копию исходной строки, а являются только ссылкой на старую строку (которая потому что это не может измениться), поэтому потребляет не так уж много памяти.

0 голосов
/ 19 октября 2011

«Я хотел знать, есть ли способ использовать только одну строку для каждого выполнения, причем каждый раз она модифицируется».- Нет, это не сработает, поскольку класс String неизменен.Если у вас есть код, который должен изменить множество строк символов, я рекомендую использовать исключительно StringBuilder (т.е. изменить ваш метод "process", чтобы он принимал аргумент StringBuilder).

0 голосов
/ 19 октября 2011

Если вам действительно нужна эта оптимизация, то единственный вариант, который я вижу, - передать индекс методу процесса и обработать исходную строку в этом методе:

for (int i=6;i>=0;--i)
{
   process(prefix, i);
}

В зависимости от того, что процессметод, это действительно может быть немного быстрее для больших значений i

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