C # конкатенация быстрее - PullRequest
4 голосов
/ 23 марта 2012

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

    string[] infoseperated = info.Split(' ');   
    for (int iii = totalremove; iii < infoseperated.Length; iii++)
    {
    newinfo += infoseperated[iii] + " ";
    }

Ответы [ 9 ]

12 голосов
/ 23 марта 2012

используйте string.Join вместо:

newinfo = string.Join(" ", infoseperated.Skip(totalremove));

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

Для каждой конкатенации все символы существующей строки должны быть скопированы в новую строку, поэтому стоимость этой операции возрастает с увеличением количества символов в строке - это Алгоритм Шлемиеля Пейнтера 1011 *

string.Join использует StringBuilder внутри, что позволяет избежать этого.

4 голосов
/ 23 марта 2012

вы должны взглянуть на класс StringBuilder . Он предназначен для таких вещей.

1 голос
/ 23 марта 2012

Каждый раз, когда вы объединяетесь с оператором +, вы создаете новый объект. Вместо этого используйте класс StringBuilder.

0 голосов
/ 23 марта 2012

Если производительность вызывает наибольшее беспокойство, самым быстрым способом, вероятно, было бы вообще не разбивать строку и не тратить дополнительные ресурсы на выделение памяти, кроме получения подстроки;

string newinfo;
while (totalremove-- > 0 && (index = info.IndexOf(' ', index)) >= 0) index+=1;
if (index >= 0)
    newinfo = info.Substring(index);
else
    newinfo = "";
0 голосов
/ 23 марта 2012

Как уже говорилось во многих других ответах, использование StringBuilder прямо или косвенно через string.Join будет намного лучше. Тем не менее, в вашем примере Split & Join, я думаю, что мы можем сделать еще лучше.

// first, find the n-th (totalremove-th) separating space.
int index = 0;
for(int i = 0; i < totalremove; i++)
{
    index = infoseperated.IndexOf(' ', index + 1);
    if(index == -1) return ""; // e.g., asked to remove 5 values, but only 3 in the string.
}

// return everything after that point.
return infoseperated.Substring(index + 1);

Пока в infoseperated нет двойных пробелов, пробелов в начале или чего-то подобного, это будет более эффективно, чем разбиение и повторная сборка строки.

0 голосов
/ 23 марта 2012

Другие ответы правильны, чтобы предложить string.Join, но они предлагают неправильную перегрузку:

newInfo = string.Join(" ", infoseparated, totalremove, infoseparated.Length - totalremove);
0 голосов
/ 23 марта 2012

Попробуйте использовать StringBuilder:

        StringBuilder sb = new StringBuilder();
        int totalremove = 0;
        string[] infoseperated = info.Split(' ');
        for (int iii = totalremove; iii < infoseperated.Length; iii++)
        {
            sb.Append(infoseperated[iii]);
            sb.Append(" ");
        }
        newinfo = sb.ToString();
0 голосов
/ 23 марта 2012

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

0 голосов
/ 23 марта 2012

Использовать System.Text.StringBuilder.Он имеет лучшую производительность, чем конкатенация строк.

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