Кто-нибудь знает более быстрый метод, чтобы сделать String.Split ()? - PullRequest
18 голосов
/ 20 февраля 2009

Я читаю каждую строку файла CSV и мне нужно получить отдельные значения в каждом столбце. Так что сейчас я просто использую:

values = line.Split(delimiter);

где line - строка, содержащая значения, разделенные разделителем.

Измеряя производительность моего ReadNextRow метода, я заметил, что он расходует 66% на String.Split, поэтому мне было интересно, знает ли кто-нибудь более быстрый метод для этого.

Спасибо!

Ответы [ 13 ]

0 голосов
/ 20 февраля 2009

Основная проблема (?) С String.Split заключается в том, что он является общим, поскольку он обслуживает многие потребности.

Если вы знаете о своих данных больше, чем Сплит, вы можете усовершенствовать свои собственные.

Например, если:

  1. Вам не нужны пустые строки, поэтому вам не нужно обрабатывать их особым образом
  2. Вам не нужно обрезать строки, поэтому вам не нужно ничего делать с ними или вокруг них
  3. Вам не нужно проверять кавычки или кавычки
  4. Вам вообще не нужно обрабатывать кавычки

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

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

Второй вопрос: почему String.Split использует столько времени по сравнению с остальным кодом. Если ответ состоит в том, что код очень мало работает с данными, то я, вероятно, не стал бы беспокоиться.

Однако, если, скажем, вы вводите данные в базу данных, то 66% времени вашего кода, проведенного в String.Split, представляет собой большую большую проблему.

0 голосов
/ 20 февраля 2009

Некоторый очень тщательный анализ String.Slit () против Regex и других методов.

Мы говорим об экономии мс на очень больших строках.

0 голосов
/ 20 февраля 2009

Можно предположить, что String.Split будет близок к оптимальному; то есть это может быть довольно сложно улучшить. Безусловно, более простое решение - проверить, нужно ли вообще разбивать строку. Вполне вероятно, что вы будете использовать отдельные строки напрямую. Если вы определите класс StringShim (ссылка на String, начало и конец индекса), вы сможете вместо этого разделить строку на набор прокладок. Они будут иметь небольшой фиксированный размер и не будут приводить к копированию строковых данных.

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