[gcc/devel/omp/gcc-9] Optimize filesystem::path::parent_path()

Tobias Burnus burnus@gcc.gnu.org
Thu Mar 5 13:59:00 GMT 2020


https://gcc.gnu.org/g:873557820764285a4b8da2d86333c26913449740

commit 873557820764285a4b8da2d86333c26913449740
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Fri Jun 14 19:11:17 2019 +0100

    Optimize filesystem::path::parent_path()
    
    Parsing a complete string is more efficient than appending each
    component one-by-one.
    
    Backport from mainline
    2019-05-29  Jonathan Wakely  <jwakely@redhat.com>
    
    	* src/c++17/fs_path.cc (path::parent_path()): Create whole path at
    	once instead of building it iteratively.
    
    From-SVN: r272303

Diff:
---
 libstdc++-v3/ChangeLog            | 8 ++++++++
 libstdc++-v3/src/c++17/fs_path.cc | 8 +++-----
 2 files changed, 11 insertions(+), 5 deletions(-)

diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 7b46e22..d4cb3be 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,6 +1,14 @@
 2019-06-14  Jonathan Wakely  <jwakely@redhat.com>
 
 	Backport from mainline
+	2019-05-29  Jonathan Wakely  <jwakely@redhat.com>
+
+	* src/c++17/fs_path.cc (path::parent_path()): Create whole path at
+	once instead of building it iteratively.
+
+2019-06-14  Jonathan Wakely  <jwakely@redhat.com>
+
+	Backport from mainline
 	2019-05-07  Jonathan Wakely  <jwakely@redhat.com>
 
 	* doc/xml/manual/intro.xml: Fix DR 2537 and DR 2566 confusion.
diff --git a/libstdc++-v3/src/c++17/fs_path.cc b/libstdc++-v3/src/c++17/fs_path.cc
index 8e01bf5..c438ddc 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;
 }



More information about the Libstdc++-cvs mailing list