Производительность 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) не имеет большого значения, когда типичная длина строки короткая.