This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[v3] Avoid istreambuf_iterator::operator*() calls
- From: Paolo Carlini <pcarlini at suse dot de>
- To: "'gcc-patches at gcc dot gnu dot org'" <gcc-patches at gcc dot gnu dot org>
- Cc: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Thu, 28 Oct 2004 14:44:26 +0200
- Subject: [v3] Avoid istreambuf_iterator::operator*() calls
Hi,
the below, trivial, change, repairs a few places where we called
unnecessarily the relatively heavy and costly operator*().
Added to the recent improvements to basic_string, on x86 we are
now roughly 10% faster in parsing floats and monetary quantities
(slightly better on x86_64 and in the statically linked case).
Regtested x86-linux, committing to mainline.
Paolo.
/////////////
2004-10-28 Paolo Carlini <pcarlini@suse.de>
* include/bits/locale_facets.tcc (num_get<>::_M_extract_float):
Cache *__beg in __c when parsing exponent sign too.
(num_get<>::do_get(..., bool&)): Cache *__beg.
(money_get<>::_M_extract)): Likewise, in money_base::value.
diff -urN libstdc++-v3-orig/include/bits/locale_facets.tcc libstdc++-v3/include/bits/locale_facets.tcc
--- libstdc++-v3-orig/include/bits/locale_facets.tcc 2004-10-22 07:32:14.000000000 +0200
+++ libstdc++-v3/include/bits/locale_facets.tcc 2004-10-28 14:03:48.000000000 +0200
@@ -329,7 +329,7 @@
{
// According to 22.2.2.1.2, p8-9, first look for thousands_sep
// and decimal_point.
- const char_type __c = *__beg;
+ char_type __c = *__beg;
if (__lc->_M_use_grouping && __c == __lc->_M_thousands_sep)
{
if (!__found_dec && !__found_sci)
@@ -390,11 +390,12 @@
// Remove optional plus or minus sign, if they exist.
if (++__beg != __end)
{
- const bool __plus = *__beg == __lit[__num_base::_S_iplus];
- if ((__plus || *__beg == __lit[__num_base::_S_iminus])
+ __c = *__beg;
+ const bool __plus = __c == __lit[__num_base::_S_iplus];
+ if ((__plus || __c == __lit[__num_base::_S_iminus])
&& !(__lc->_M_use_grouping
- && *__beg == __lc->_M_thousands_sep)
- && !(*__beg == __lc->_M_decimal_point))
+ && __c == __lc->_M_thousands_sep)
+ && !(__c == __lc->_M_decimal_point))
{
__xtrc += __plus ? '+' : '-';
++__beg;
@@ -668,15 +669,17 @@
size_t __n;
for (__n = 0; __beg != __end; ++__n, ++__beg)
{
+ const char_type __c = *__beg;
+
if (__testf)
if (__n < __lc->_M_falsename_size)
- __testf = *__beg == __lc->_M_falsename[__n];
+ __testf = __c == __lc->_M_falsename[__n];
else
break;
if (__testt)
if (__n < __lc->_M_truename_size)
- __testt = *__beg == __lc->_M_truename[__n];
+ __testt = __c == __lc->_M_truename[__n];
else
break;
@@ -1294,7 +1297,7 @@
__res.reserve(32);
const char_type* __lit_zero = __lit + money_base::_S_zero;
- const money_base::pattern __p = __lc->_M_neg_format;
+ const money_base::pattern __p = __lc->_M_neg_format;
for (int __i = 0; __i < 4 && __testvalid; ++__i)
{
const part __which = static_cast<part>(__p.field[__i]);
@@ -1356,14 +1359,15 @@
// grouping of found thousands separators.
for (; __beg != __end; ++__beg)
{
+ const char_type __c = *__beg;
const char_type* __q = __traits_type::find(__lit_zero,
- 10, *__beg);
+ 10, __c);
if (__q != 0)
{
__res += money_base::_S_atoms[__q - __lit];
++__n;
}
- else if (*__beg == __lc->_M_decimal_point
+ else if (__c == __lc->_M_decimal_point
&& !__testdecfound)
{
__last_pos = __n;
@@ -1371,7 +1375,7 @@
__testdecfound = true;
}
else if (__lc->_M_use_grouping
- && *__beg == __lc->_M_thousands_sep
+ && __c == __lc->_M_thousands_sep
&& !__testdecfound)
{
if (__n)