This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[Patch] Fix libstdc++/19422
- From: Paolo Carlini <pcarlini at suse dot de>
- To: libstdc++ <libstdc++ at gcc dot gnu dot org>
- Date: Fri, 14 Jan 2005 19:11:40 +0100
- Subject: [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);
+ }
+}