2013-07-31 2 views
5

Joe Duffy's Blog подразумевает использование string.Substring более эффективно, чем string.Split.Как String.Substring эффективнее String.Split?

Я не знаю, если его высказывание Substring не выделяет новую строку или если она более эффективна, потому что она не делает ненужных распределений. Не могли бы вы объяснить, насколько это более эффективно и показать пример.

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

string str = ...; 
string[] substrs = str.Split(','); 
foreach (string subtr in substrs) { 
Process(substr); 
} 

Как нижеследующее более эффективным

string str = ...; 
int lastIndex = 0; 
int commaIndex; 
while ((commaIndex = str.IndexOf(',', commaIndex)) != -1) { 
    Process(substr, lastIndex, commaIndex); 
    lastIndex = commaIndex + 1; 

Что я вижу, использует String.IndexOf, чтобы найти индекс запятой, то обработка строки. Я предполагаю, что он намерен использовать String.Substring для извлечения данных во время его обработки. Один из приведенных ниже комментариев предложил, чтобы он потянул его за персонаж. Будет ли он тянуть персонажей, пока он не ударит следующую запятую, возможно, создав массив символов?

+0

Да sting.Index of используется для поиска Индекса запятой, но внутри вашего гипотетического метода обработки вам все равно понадобится сделать подстроку для извлечения данных внутри этих индексов. правильно? –

+0

Я стою исправлен - пример действительно запутанный – BrokenGlass

+0

«Есть API-интерфейсы наземных мин, скрытые там, такие как String.Split и String.Substring» подразумевает, что он считает, что подстрока не эффективна. И я думаю, что «у String есть индекс, и он безопасен по типу! Поэтому синтаксический анализ на месте, по крайней мере, не приведет к переполнению буфера» подразумевает, что он намерен получить доступ к символу подстроки по символу, а не используя 'Подстрока'. – Blorgbeard

ответ

7

Хорошее горе.

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

Два программиста представили свои ответы. Программа Programmer A выполнялась быстрее всего, и менеджер собирался объявить его победителем, когда программист B указал, что ответ, предоставленный программой программиста A, немного отстал.

«Но моя программа по-прежнему быстро, я заслужил, чтобы выиграть», сказал программист А.

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

Второй пример Джо Даффи, где он избегает использования string.Split(), является неправильным. Он не будет компилироваться. Переменная «substr» не определена.

Я отдыхаю в своем случае.

+0

хорошая шутка, :), мне это нравится. – David

+1

Хорошая шутка, но я не уверен, в чем дело. Ошибка Джо Даффи - простая опечатка - он хотел сказать «str» вместо «substr». – Blorgbeard

+4

@Blorgbeard: То, что он случайно сломал код, может привести домой домой. Чем больше вы усложняете вещи, тем больше вероятность того, что все это закрасться. Особенно если вы все усложняете. Не помогает его делу, это тоже была опечатка; это свидетельствует о том, что он не удосужился проверить или профайл кода, прежде чем он начал разглагольствовать о подстроках. Фактически, набрав его в VS и компилируя, он обнаружил бы ошибку. – cHao

Смежные вопросы