regexec и regcomp более эффективны, чем сам strncmp? - PullRequest
0 голосов
/ 24 июля 2011

У меня есть такая строка:

I am down in the town seeing a crown="larry" with a cherry="red"

Я хочу написать программу, которая спрашивает пользователя, что он хочет.Если она запрашивает строку, которая должна иметь «larry» в качестве короны и «red» cherry, мне нужно вернуть строку.

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

Вопрос: выполнение regexec и regcomp более эффективно или разбиение строки и выполнение strncmp?

PS: Кажется, что regexec нужно было бы выполнить какое-то внутреннее сравнение, и эторазработан, чтобы быть очень эффективным.

Ответы [ 2 ]

1 голос
/ 25 июля 2011

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

Если вы используете strstr(), вы будете искать такие строки, как:

crown="larry"
cherry="red"

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

Однако стоит измерить разницу.Это может зависеть от реализации strstr();некоторые очень хороши.Итак, проведите измерения на платформах, которые вас интересуют, и выберите наиболее подходящую для вас.

0 голосов
/ 25 июля 2011

Поскольку вы, вероятно, компилируете новое регулярное выражение каждый раз, когда будете делать regexec(), это, вероятно, будет немного медленнее, чем использование strncmp() для проверки ключевого слова, например, "crown =", а затем проверка, еслизначение равно "\" larry \ "".

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

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

Другими словами, вам придется профилировать это, чтобы быть уверенным, но я думаю, что strncmp() будет более производительным, чем комбинации regcomp() и regexec().Регулярные выражения, конечно, гораздо более гибкие, но я не думаю, что вам здесь это нужно.

Добавление

Предполагая, что '=' не является символомкоторые будут встречаться в ваших строках очень часто, вы, конечно, можете использовать strchr(), чтобы найти каждое вхождение '=' в строке, а затем проверить, является ли следующий символ '\ "'. Затем вы можете отсканировать назад, чтобы увидетьесли ключ совпадает. strchr() очень вероятно намного быстрее, чем strncmp().

...