This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ 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]

[Patch] Fix libstdc++/19422


Hi everyone,

the below, very simple, is what I have just finished regtesting
and performance testing on x86/x86_64-linux.

These are some (slightly edited) numbers from make-check on
my home machine (P4-2400):

current
-------
50000 14r 14u
100000 29r 29u 150000 44r 43u
200000 61r 59u
250000 75r 73u
300000 91r 89u
350000 107r 107u
400000 122r 122u
450000 139r 137u
500000 153r 150u
550000 170r 170u
600000 186r 183u
650000 202r 201u
700000 218r 216u
750000 234r 231u
800000 249r 248u
850000 267r 264u
900000 283r 282u
950000 301r 298u
1000000 318r 315u


patched
-------
50000      11r   11u
100000     22r   22u
150000     34r   34u
200000     46r   45u
250000     56r   55u
300000     68r   67u
350000     79r   78u
400000     91r   91u
450000    102r  101u
500000    114r  113u
550000    124r  122u
600000    137r  135u
650000    147r  146u
700000    159r  157u
750000    169r  166u
800000    182r  182u
850000    192r  190u
900000    205r  203u
950000    215r  213u
1000000   226r  223u

Moreover, the ratio to the corresponding list results is almost
perfectly constant in the patched case (as expected), slowly
growing currently.

I'd like to commit the below before the end of the (italian) day.

Paolo.

////////////////
2005-01-14  Paolo Carlini  <pcarlini@suse.de>

	PR libstdc++/19422
	* include/bits/stl_tree.h (_Rb_tree<>::insert_equal(_II, _II),
	_Rb_tree<>::insert_unique(_II, _II)): Use insert_equal (insert_unique,
	respectively) with hint (end()).
	* testsuite/performance/23_containers/set_create_from_sorted.cc: New.
diff -urN libstdc++-v3-orig/include/bits/stl_tree.h libstdc++-v3/include/bits/stl_tree.h
--- libstdc++-v3-orig/include/bits/stl_tree.h	2004-10-13 02:11:13.000000000 +0200
+++ libstdc++-v3/include/bits/stl_tree.h	2005-01-14 11:57:57.000000000 +0100
@@ -986,7 +986,7 @@
       insert_equal(_II __first, _II __last)
       {
 	for (; __first != __last; ++__first)
-	  insert_equal(*__first);
+	  insert_equal(end(), *__first);
       }
 
   template<typename _Key, typename _Val, typename _KoV,
@@ -997,7 +997,7 @@
     insert_unique(_II __first, _II __last)
     {
       for (; __first != __last; ++__first)
-	insert_unique(*__first);
+	insert_unique(end(), *__first);
     }
 
   template<typename _Key, typename _Val, typename _KeyOfValue,
diff -urN libstdc++-v3-orig/testsuite/performance/23_containers/set_create_from_sorted.cc libstdc++-v3/testsuite/performance/23_containers/set_create_from_sorted.cc
--- libstdc++-v3-orig/testsuite/performance/23_containers/set_create_from_sorted.cc	1970-01-01 01:00:00.000000000 +0100
+++ libstdc++-v3/testsuite/performance/23_containers/set_create_from_sorted.cc	2005-01-14 18:28:13.000000000 +0100
@@ -0,0 +1,83 @@
+// Copyright (C) 2005 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
+// USA.
+
+// As a special exception, you may use this file as part of a free software
+// library without restriction.  Specifically, if other files instantiate
+// templates or use macros or inline functions from this file, or you compile
+// this file and link it with other files to produce an executable, this
+// file does not by itself cause the resulting executable to be covered by
+// the GNU General Public License.  This exception does not however
+// invalidate any other reasons why the executable file might be covered by
+// the GNU General Public License.
+
+#include <vector>
+#include <set>
+#include <list>
+#include <sstream>
+#include <testsuite_performance.h>
+
+// adjust for your setup
+static const unsigned max_size = 1000000; // avoid excessive swap file use!
+static const unsigned iterations = 10;    // make results less random while
+static const unsigned step = 50000;       // keeping the total time reasonable
+
+// libstdc++/19422
+int main()
+{
+  using namespace std;
+  using namespace __gnu_test;
+  time_counter time;
+  resource_counter resource;
+
+  typedef set<unsigned>  the_set;
+  typedef list<unsigned> the_list;
+
+  vector<unsigned> v(max_size, 0);
+  for (unsigned i = 0; i != max_size; ++i)
+    v[i] = i; // initialize sorted array
+
+  report_header(__FILE__, "set:");
+  for (unsigned count = step; count <= max_size; count += step)
+    {
+      ostringstream oss;
+      oss << count;
+
+      // measure set construction time
+      start_counters(time, resource);
+      for (unsigned i = 0; i != iterations; ++i)
+	the_set(v.begin(), v.begin() + count);
+      stop_counters(time, resource);
+      report_performance(__FILE__, oss.str(), time, resource);
+      clear_counters(time, resource);
+    }
+
+  report_header(__FILE__, "list:");
+  for (unsigned count = step; count <= max_size; count += step)
+    {
+      ostringstream oss;
+      oss << count;
+
+      // measure list construction time (surely linear in count)
+      start_counters(time, resource);
+      for (unsigned i = 0; i != iterations; ++i)
+	the_list(v.begin(), v.begin() + count);
+      stop_counters(time, resource);
+      report_performance(__FILE__, oss.str(), time, resource);
+      clear_counters(time, resource);
+    }
+}

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