
Janek Kozicki <janek_listy <at> wp.pl> writes:
wow. It's a good programming practice to use const& everywhere where possible. T'd love to see this patch applied. Thanks!
The below second patch provides much further improvement. I realize the second patch is somewhat of a hack, but it illustrates where the rest of the slowdown is coming from and may suggest a better way of fixing it. Before second patch: MSVC++2005: 1: 2406 2: 2359 3: 1500 4: 297 (run times) G++/Intel: 1: 703 2: 703 3: 188 4: 172 After second patch: MSVC++2005: 1: 235 2: 250 3: 251 4: 282 (run times) G++/Intel: 1: 141 2: 141 3: 109 4: 172 There's likely other places in the string algorithms code that could benefit from similar changes. --davidm <snip> diff -udr boost/boost/algorithm/string/detail/classification.hpp boost-patched/boost/algorithm/string/detail/classification.hpp --- boost/boost/algorithm/string/detail/classification.hpp 2006-04-16 05:46:34.000000000 -0400 +++ boost-patched/boost/algorithm/string/detail/classification.hpp 2006-07-20 08:58:02.359849300 -0400 @@ -21,6 +21,7 @@ #include <boost/algorithm/string/predicate_facade.hpp> #include <boost/type_traits/remove_const.hpp> +#include <locale> namespace boost { namespace algorithm { @@ -36,14 +37,15 @@ template <class Args> struct sig { typedef bool type; }; // Constructor from a locale - is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = std::locale()) : + is_classifiedF(std::ctype_base::mask Type, std::locale const & Loc = default_locale_) : m_Type(Type), m_Locale(Loc) {} // Operation template<typename CharT> bool operator()( CharT Ch ) const { - return std::use_facet< std::ctype<CharT> >(m_Locale).is( m_Type, Ch ); + static const std::ctype<CharT> & data = std::use_facet< std::ctype<CharT> >(m_Locale); + return data.is( m_Type, Ch ); } #if defined(__BORLANDC__) && (__BORLANDC__ >= 0x560) && (__BORLANDC__ <= 0x582) && !defined(_USE_OLD_RW_STL) @@ -56,7 +58,7 @@ private: const std::ctype_base::mask m_Type; - const std::locale m_Locale; + const std::locale & m_Locale; }; // is_any_of functor </snip>