Можно создать дубликат:
C++ string::find complexityПроизводительность станд :: strstr vs. станд :: строка :: найти
Недавно я узнал, что функция std::string::find
является порядок медленнее чем функция std::strstr
- в моей среде с GCC 4.7 на Linux. Разница в производительности зависит от длины строк и от аппаратной архитектуры.
Однако есть веская причина для разницы: std::string::find
в основном вызывает std::memcmp
в цикле - с временной сложностью O(m * n)
. Напротив, std::strstr
высоко оптимизирован для архитектуры оборудования (например, с инструкциями SSE) и использует более сложный алгоритм сопоставления строк (по-видимому, Knuth-Morris-Pratt).
Я также был удивлен, когда не нашел сложностей во времени этих двух функций в языковых документах (т. Е. Чертежах N3290 и N1570). Я только нашел временные сложности для char_traits
. Но это не помогает, потому что нет функции для поиска подстроки в char_traits
.
Я бы ожидал, что std::strstr
и memmem
содержат аналогичные оптимизации с почти одинаковой производительностью. И до недавнего времени я предполагал, что std::string::find
использует memmem
внутренне.
Вопросов: Есть ли хорошая причина, почему std::string::find
не использует std::memmem
? И отличается ли это от другой реализации?
Вопрос не в следующем: Какова наилучшая реализация этой функции? На C++ действительно сложно спорить, если он медленнее C. Я бы не имел значения, будут ли обе реализации медленными. Это разница в производительности, которая действительно болит.
@FrerichRaabe: Вы правы, есть несколько совпадений в двух вопросах. Но мои вопросы более конкретны, а другая статья не отвечает ни одному из них. – nosid
@ nosid: да. Посмотрите, в частности, на дополнительное объяснение в комментариях dietmar kuhl о среднем случае против наихудшего случая и сложности пространства, почему это, скорее всего, не используется. Эти аргументы не изменяются, если вы повторно используете 'std :: memmem' и реализуете алгоритм с нуля. – KillianDS