Hello,

I am proposing a small tweak to the implementation of __includes, which in my application saves 20% of the running time. I noticed it because using range-v3 was giving unexpected performance gains.

The unified diff is attached, but let me first show a more readable context diff.

*** /tmp/zzm2NX_stl_algo.h      2020-06-19 10:48:58.702634366 +0200
--- libstdc++-v3/include/bits/stl_algo.h        2020-06-18 23:16:06.183427245 
+0200
***************
*** 2783,2797 ****
               _Compare __comp)
      {
        while (__first1 != __last1 && __first2 != __last2)
!       if (__comp(__first2, __first1))
!         return false;
!       else if (__comp(__first1, __first2))
!         ++__first1;
!       else
!         {
!           ++__first1;
            ++__first2;
!         }

        return __first2 == __last2;
      }
--- 2783,2795 ----
               _Compare __comp)
      {
        while (__first1 != __last1 && __first2 != __last2)
!       {
!         if (__comp(__first2, __first1))
!           return false;
!         if (!__comp(__first1, __first2))
            ++__first2;
!         ++__first1;
!       }

        return __first2 == __last2;
      }

As you can see, it isn't much change. Some of the gain comes from pulling the 2 calls ++__first1 out of the condition so there is just one call. And most of the gain comes from replacing the resulting

if (__comp(__first1, __first2))
  ;
else
  ++__first2;

with

if (!__comp(__first1, __first2))
  ++__first2;

I was very surprised that the code ended up being so different for such a change, and I still don't really understand where the extra time is going...

Anyway, while I blame the compiler for not generating very good code with the current implementation, I believe the change can be seen as a simplification and should be pushed to master. It regtests fine.

2020-06-20  Marc Glisse  <marc.gli...@inria.fr>

        * include/bits/stl_algo.h (__includes): Simplify the code.

(as with the patch for std::optional, I still haven't worked on my ssh key issue and cannot currently push)

--
Marc Glisse
diff --git a/libstdc++-v3/include/bits/stl_algo.h b/libstdc++-v3/include/bits/stl_algo.h
index fd6edd0d5f4..550a15f2b3b 100644
--- a/libstdc++-v3/include/bits/stl_algo.h
+++ b/libstdc++-v3/include/bits/stl_algo.h
@@ -2783,15 +2783,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 	       _Compare __comp)
     {
       while (__first1 != __last1 && __first2 != __last2)
-	if (__comp(__first2, __first1))
-	  return false;
-	else if (__comp(__first1, __first2))
-	  ++__first1;
-	else
-	  {
-	    ++__first1;
+	{
+	  if (__comp(__first2, __first1))
+	    return false;
+	  if (!__comp(__first1, __first2))
 	    ++__first2;
-	  }
+	  ++__first1;
+	}
 
       return __first2 == __last2;
     }

Reply via email to