Parsing a complete string is more efficient than appending each
component one-by-one.

        * src/c++17/fs_path.cc (path::parent_path()): Create whole path at
        once instead of building it iteratively.

Tested powerpc64le-linux and x86_64-w64-mingw32, committed to trunk.


commit ed3d2a78e4bb6ee1c2b7483bd03d5a9747309edf
Author: Jonathan Wakely <jwak...@redhat.com>
Date:   Wed May 29 21:30:04 2019 +0100

    Optimize filesystem::path::parent_path()
    
    Parsing a complete string is more efficient than appending each
    component one-by-one.
    
            * src/c++17/fs_path.cc (path::parent_path()): Create whole path at
            once instead of building it iteratively.

diff --git a/libstdc++-v3/src/c++17/fs_path.cc 
b/libstdc++-v3/src/c++17/fs_path.cc
index 8e01bf510d3..c438ddc61fd 100644
--- a/libstdc++-v3/src/c++17/fs_path.cc
+++ b/libstdc++-v3/src/c++17/fs_path.cc
@@ -1523,11 +1523,9 @@ path::parent_path() const
     __ret = *this;
   else if (_M_cmpts.size() >= 2)
     {
-      for (auto __it = _M_cmpts.begin(), __end = std::prev(_M_cmpts.end());
-          __it != __end; ++__it)
-       {
-         __ret /= *__it;
-       }
+      const auto parent = std::prev(_M_cmpts.end(), 2);
+      const auto len = parent->_M_pos + parent->_M_pathname.length();
+      __ret.assign(_M_pathname.substr(0, len));
     }
   return __ret;
 }

Reply via email to