String.Split Эффективность Вопрос - PullRequest
2 голосов
/ 09 ноября 2010

Я пишу поисковое приложение, которое маркирует большой текстовый корпус.

Синтаксический анализатор текста должен удалить из текста любую тарабарщину (т. Е. [^ A-zA-Z0-9])

У меня в голове было 2 идеи, как это сделать:

1) Поместите текст в строку, преобразуйте его в charArray, используя String.tocharArray, а затем запустите char за char с помощью цикла -> while (position

2) Удалите все не цифры / альфа, используя string.replace, а затем string.split с некоторыми разделителями, это означает, что мне нужно дважды выполнить всю строку. Один раз, чтобы удалить плохие символы, а затем снова разделить его.

Я предположил, что, поскольку # 1 делает то же самое, что и # 2, но в O (n) это будет быстрее, но после тестирования обоих # 2 будет намного (намного!) Быстрее.

Я пошел еще дальше и просмотрел код, стоящий за String.Strip, используя отражатель .net red-gate. Он запускает неуправляемый символ за символом точно так же, как # 1, но все еще намного быстрее.

Понятия не имею, почему # 2 намного быстрее, чем # 1.

Есть идеи?

Ответы [ 2 ]

1 голос
/ 09 ноября 2010

Как насчет этой идеи:

  1. Создание строки
  2. Загрузка всего набора данных в строку
  3. Создание StringBuilder с достаточным количеством предварительно выделенного пространства дляудерживайте всю строку
  4. Идите символ за символом через строку и, если символ алфавитно-цифровой, добавьте его в StringBuilder.
  5. В конце вытащите строку из StringBuilder.

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

0 голосов
/ 09 ноября 2010

djTeller,
Тот факт, что # 2 быстрее всего зависит от вашего метода # 1.
Возможно, вы захотите поделиться своим методом # 1 с нами; возможно, это просто очень медленно и возможно сделать это быстрее, чем # 2, даже.
Да, оба по существу O (n), но это фактическая реализация O (n); как ты на самом деле сделал # 1?

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

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