Выполнение функции обрезки
моя старая функция Утески:
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
чтобы увидеть, имеет ли это лучшую производительность. Эта функция будет выполнять операцию на месте, а не на новой строке.