Производительность std:: strstr против std:: string:: find [дубликат]
Возможные Дубликаты:
C++ string:: find complexity
недавно я заметил, что функция 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. Я бы не имел значения, если бы обе реализации были медленными. Это разница в производительности, которая действительно болит.
1 ответов
во-первых, что memmem
? Я не могу найти это в стандарте C++, ни
Стандарт Posix (который содержит все стандартные функции C).
во-вторых, любые значения измерения будут зависеть от фактических данных. С помощью
КМП, например, будет pessimisation во многих случаях, вероятно,
большинство случаев, когда функции-члены есть ;
время для настройки необходимых таблиц часто будет больше, чем
общее время алгоритма straightforeward. Такие вещи, как O(m*n)
не имеет большого значения, когда типичная длина строки короткая.