[libc++] reduce <complex> parsing time
authorLouis Dionne <ldionne@apple.com>
Wed, 19 Feb 2020 21:09:41 +0000 (16:09 -0500)
committerLouis Dionne <ldionne@apple.com>
Wed, 19 Feb 2020 21:09:41 +0000 (16:09 -0500)
Instead of including <ios> for ios_base::failbit, simply get failbit
member of the template argument. Print directly to a stream instead
of using intermediate ostringstream.

    Parsing time: 874ms -> 164ms (-81%)

Thanks to Nikita Kniazev for the patch!

Differential Revision: https://reviews.llvm.org/D71214

libcxx/include/complex

index c168406befbdd967b3d4c4f8ff7760cd1ab909bf..92295be976ccfa99b5f2c9bf9cc2d61153d3f2dc 100644 (file)
@@ -243,7 +243,7 @@ template<class T, class charT, class traits>
 #include <type_traits>
 #include <stdexcept>
 #include <cmath>
-#include <sstream>
+#include <iosfwd>
 #include <version>
 
 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
@@ -1406,10 +1406,10 @@ operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
                             __x = complex<_Tp>(__r, __i);
                         }
                         else
-                            __is.setstate(ios_base::failbit);
+                            __is.setstate(__is.failbit);
                     }
                     else
-                        __is.setstate(ios_base::failbit);
+                        __is.setstate(__is.failbit);
                 }
                 else if (__c == _CharT(')'))
                 {
@@ -1417,10 +1417,10 @@ operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
                     __x = complex<_Tp>(__r, _Tp(0));
                 }
                 else
-                    __is.setstate(ios_base::failbit);
+                    __is.setstate(__is.failbit);
             }
             else
-                __is.setstate(ios_base::failbit);
+                __is.setstate(__is.failbit);
         }
         else
         {
@@ -1429,11 +1429,11 @@ operator>>(basic_istream<_CharT, _Traits>& __is, complex<_Tp>& __x)
             if (!__is.fail())
                 __x = complex<_Tp>(__r, _Tp(0));
             else
-                __is.setstate(ios_base::failbit);
+                __is.setstate(__is.failbit);
         }
     }
     else
-        __is.setstate(ios_base::failbit);
+        __is.setstate(__is.failbit);
     return __is;
 }
 
@@ -1441,12 +1441,7 @@ template<class _Tp, class _CharT, class _Traits>
 basic_ostream<_CharT, _Traits>&
 operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x)
 {
-    basic_ostringstream<_CharT, _Traits> __s;
-    __s.flags(__os.flags());
-    __s.imbue(__os.getloc());
-    __s.precision(__os.precision());
-    __s << '(' << __x.real() << ',' << __x.imag() << ')';
-    return __os << __s.str();
+    return __os << '(' << __x.real() << ',' << __x.imag() << ')';
 }
 
 #if _LIBCPP_STD_VER > 11