This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]