Выполнение функции обрезки

моя старая функция Утески:

string TailTrimString (const string & sSource, const char *chars) {
  size_t End = sSource.find_last_not_of(chars);
  if (End == string::npos) {
    // only "*chars"
    return "";
  }
  if (End == sSource.size() - 1) {
    // noting to trim
    return sSource;
  }
  return sSource.substr(0, End + 1);
}

вместо этого я решил использовать boost и написал тривиальное:

string TailTrimString (const string & sSource, const char *chars) {
    return boost::algorithm::trim_right_copy_if(sSource,boost::algorithm::is_any_of(chars));
}

и я был поражен, узнав, что новая функция работает намного медленнее. Я сделал некоторое профилирование, и я вижу, что функция is_any_of очень медленно.

возможно ли, что реализация boost работает медленнее, чем моя довольно простая реализация? Есть ли что-нибудь, что я должен использовать вместо is_any_of улучшить представление?

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

версия boost, которую я использую, 1.38, которая довольно старая, но я думаю, что этот код не слишком изменился с тех пор.

спасибо.

3 ответов


возможно, что реализация boost работает медленнее, чем моя довольно простая реализация?

конечно.

есть ли что-нибудь, что я должен использовать вместо is_any_of для улучшения производительности?

Да -- ваш исходный код. Вы ничего не сказали о том, что у него есть дефект или причина, по которой вы повторно внедрили его с помощью boost. Если в исходном коде не было дефекта, то не было действительного причина отказаться от первоначальной реализации.

введение Boost в кодовую базу имеет смысл. Это приносит много функциональности, которая может быть полезной. Но потрошить функцию с единственной целью использования новой технологии-большая ошибка новичка.

EDIT:

в ответ на ваш комментарий:

Я все еще не понимаю, почему производительность boost хуже.

ручная функция, предназначенная для выполнения одной конкретное задание для одного конкретного приложения часто будет быстрее, чем общее решение. Boost-отличная библиотека универсальных инструментов, которая может сэкономить много программ и много дефектов. Но родовое. Вам может потребоваться только обрезать строку определенным образом, но Boost обрабатывает все. На это нужно время.


в ответ на ваш вопрос об относительной производительности std::string::find_last_not_of, обернет процедуры строки C (например,strcspan), и это очень быстро, однако boost::algorithm::is_any_of использует (вероятно, используется для использования, я бы рискнул, что в более поздних версиях это изменилось!) a std::set для набора символов, чтобы искать и не увидеть в этом наборе для каждого персонажа - который не будет так быстро!

EDIT: просто чтобы добавить Эхо, ваша функция работает, она не сломана, она не медленная, поэтому не портили его...


в ответ на ваш вопрос об относительной производительности.

вы используете boost::algorithm::trim_right_copy_if который, в соответствии с именем, создает копию входных данных перед обрезкой. Попробуйте использовать boost::algorithm::trim_right_if чтобы увидеть, имеет ли это лучшую производительность. Эта функция будет выполнять операцию на месте, а не на новой строке.