Работа с String.Substrings, есть ли нехватка производительности? - PullRequest
1 голос
/ 25 ноября 2011

Я пытаюсь разобрать большую текстовую строку.Мне нужно разбить исходную строку на блоки по 15 символов (и следующий блок может содержать пробелы, поэтому используется функция обрезки).Я использую две строки, оригинальную и временную.Эта временная строка используется для хранения каждого блока длиной 15.Интересно, могу ли я попасть в проблему производительности, потому что строки неизменны.Это код:

string original = "THIS IS SUPPOSE TO BE A LONG STRING AN I NEED TO SPLIT IT IN BLOCKS OF 15 CHARACTERS.SO";
string temp = string.Empty;
while (original.Length != 0)
{
   temp = original.Substring(0, 14).Trim();

   original = original.Substring(14, (original.Length -14)).Trim();
}

Я ценю ваши отзывы, чтобы найти лучший способ для достижения этой функциональности.

Ответы [ 4 ]

3 голосов
/ 25 ноября 2011

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

for (var startIndex = 0; startIndex < original.Length; startIndex += 15)
{
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim();
}

Это работает лучше, потому что вы не копируете последние все 15 символов оригинальной строки при каждой итерации цикла.

EDIT

Чтобы переместить индекс к следующему непробельному символу, вы можете сделать что-то вроде этого:

for (var startIndex = 0; startIndex < original.Length; )
{
    if (char.IsWhiteSpace(string, startIndex)
    {
        startIndex++;
        continue;
    }
    temp = original.Substring(startIndex, Math.Min(original.Length - startIndex, 15)).Trim();
    startIndex += 15;
}
1 голос
/ 25 ноября 2011

Если ваша строка original длиннее нескольких тысяч символов, у вас будет заметное (> 0,1 с) время обработки и большое давление ГХ. Первый Substring звонок в порядке, и я не думаю, что вы можете избежать этого, если не зайдете глубоко внутрь System.String и не возитесь с m_FirstChar. Второго Substring можно полностью избежать при переходе от символа к символу и итерации по int.

1 голос
/ 25 ноября 2011

Я думаю, что вы правы в неизменной проблеме - воссоздание «оригинала» каждый раз, вероятно, не самый быстрый способ.

Как насчет передачи 'original' в класс StringReader ?

0 голосов
/ 25 ноября 2011

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

В целом, было бы неплохо использовать класс StringBuilder , который позволит вам работать со строками «более изменчивым» способом без снижения производительности, например, удалить с его начала без перераспределения всей строки .

Однако в вашем примере я хотел бы выбросить извести, которая берет подстроку из оригинала и заменяет ее некоторым кодом, который обновит некоторые индексы, указывающие, откуда вы должны получить новую подстроку. Тогда while условие будет просто проверять, будет ли ваш индекс в конце строки, а ваш временный метод будет принимать подстроку не от 0 до 14, а от i, где i будет этим индексом.

Однако - не оптимизируйте код, если вам не нужно, я предполагаю, что вам нужно больше производительности и вы хотите пожертвовать временем и / или написать немного менее понятный код для большей эффективности.

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