re PR libstdc++/58437 (Sorting value in reverse order is much slower compare to gcc44)
2013-09-30 Chris Jefferson <chris@bubblescope.net> PR libstdc++/58437 * include/bits/stl_algo.h (__move_median_first): Rename to __move_median_to_first, change to take an addition argument. (__unguarded_partition_pivot): Adjust. * testsuite/performance/25_algorithms/sort.cc: New. * testsuite/performance/25_algorithms/sort_heap.cc: Likewise. * testsuite/performance/25_algorithms/stable_sort.cc: Likewise. From-SVN: r203035
This commit is contained in:
parent
ca406576e5
commit
a10bad862f
|
@ -1,3 +1,13 @@
|
||||||
|
2013-09-30 Chris Jefferson <chris@bubblescope.net>
|
||||||
|
|
||||||
|
PR libstdc++/58437
|
||||||
|
* include/bits/stl_algo.h (__move_median_first): Rename to
|
||||||
|
__move_median_to_first, change to take an addition argument.
|
||||||
|
(__unguarded_partition_pivot): Adjust.
|
||||||
|
* testsuite/performance/25_algorithms/sort.cc: New.
|
||||||
|
* testsuite/performance/25_algorithms/sort_heap.cc: Likewise.
|
||||||
|
* testsuite/performance/25_algorithms/stable_sort.cc: Likewise.
|
||||||
|
|
||||||
2013-09-28 François Dumont <fdumont@gcc.gnu.org>
|
2013-09-28 François Dumont <fdumont@gcc.gnu.org>
|
||||||
|
|
||||||
* include/bits/stl_algo.h (remove_copy, remove_copy_if): Declare
|
* include/bits/stl_algo.h (remove_copy, remove_copy_if): Declare
|
||||||
|
@ -613,7 +623,7 @@
|
||||||
(_BracketMatcher<>::_M_add_collating_element): Likewise.
|
(_BracketMatcher<>::_M_add_collating_element): Likewise.
|
||||||
(_BracketMatcher<>::_M_make_range): Likewise.
|
(_BracketMatcher<>::_M_make_range): Likewise.
|
||||||
* include/bits/regex_compiler.tcc (_Compiler<>::_M_atom): Use
|
* include/bits/regex_compiler.tcc (_Compiler<>::_M_atom): Use
|
||||||
apropriate constructors of matchers above.
|
appropriate constructors of matchers above.
|
||||||
* testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc:
|
* testsuite/28_regex/algorithms/regex_match/ecma/char/anymatcher.cc:
|
||||||
New.
|
New.
|
||||||
* testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc: New.
|
* testsuite/28_regex/algorithms/regex_match/ecma/char/backref.cc: New.
|
||||||
|
|
|
@ -72,25 +72,27 @@ namespace std _GLIBCXX_VISIBILITY(default)
|
||||||
{
|
{
|
||||||
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
_GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
|
|
||||||
/// Swaps the median value of *__a, *__b and *__c under __comp to *__a
|
/// Swaps the median value of *__a, *__b and *__c under __comp to *__result
|
||||||
template<typename _Iterator, typename _Compare>
|
template<typename _Iterator, typename _Compare>
|
||||||
void
|
void
|
||||||
__move_median_first(_Iterator __a, _Iterator __b, _Iterator __c,
|
__move_median_to_first(_Iterator __result,_Iterator __a, _Iterator __b,
|
||||||
_Compare __comp)
|
_Iterator __c, _Compare __comp)
|
||||||
{
|
{
|
||||||
if (__comp(__a, __b))
|
if (__comp(__a, __b))
|
||||||
{
|
{
|
||||||
if (__comp(__b, __c))
|
if (__comp(__b, __c))
|
||||||
std::iter_swap(__a, __b);
|
std::iter_swap(__result, __b);
|
||||||
else if (__comp(__a, __c))
|
else if (__comp(__a, __c))
|
||||||
std::iter_swap(__a, __c);
|
std::iter_swap(__result, __c);
|
||||||
|
else
|
||||||
|
std::iter_swap(__result, __a);
|
||||||
}
|
}
|
||||||
else if (__comp(__a, __c))
|
else if (__comp(__a, __c))
|
||||||
return;
|
std::iter_swap(__result, __a);
|
||||||
else if (__comp(__b, __c))
|
else if (__comp(__b, __c))
|
||||||
std::iter_swap(__a, __c);
|
std::iter_swap(__result, __c);
|
||||||
else
|
else
|
||||||
std::iter_swap(__a, __b);
|
std::iter_swap(__result, __b);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is an overload used by find algos for the Input Iterator case.
|
/// This is an overload used by find algos for the Input Iterator case.
|
||||||
|
@ -1915,7 +1917,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
|
||||||
_RandomAccessIterator __last, _Compare __comp)
|
_RandomAccessIterator __last, _Compare __comp)
|
||||||
{
|
{
|
||||||
_RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
_RandomAccessIterator __mid = __first + (__last - __first) / 2;
|
||||||
std::__move_median_first(__first, __mid, (__last - 1), __comp);
|
std::__move_median_to_first(__first, __first + 1, __mid, (__last - 2),
|
||||||
|
__comp);
|
||||||
return std::__unguarded_partition(__first + 1, __last, __first, __comp);
|
return std::__unguarded_partition(__first + 1, __last, __first, __comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,65 @@
|
||||||
|
// Copyright (C) 2013 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 3, 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 COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <testsuite_performance.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
time_counter time;
|
||||||
|
resource_counter resource;
|
||||||
|
|
||||||
|
const int max_size = 10000000;
|
||||||
|
|
||||||
|
std::vector<int> v(max_size);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = -i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "reverse", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "forwards", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
// a simple psuedo-random series which does not rely on rand() and friends
|
||||||
|
v[0] = 0;
|
||||||
|
for (int i = 1; i < max_size; ++i)
|
||||||
|
v[i] = (v[i-1] + 110211473) * 745988807;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "random", time, resource);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
// Copyright (C) 2013 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 3, 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 COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <testsuite_performance.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
time_counter time;
|
||||||
|
resource_counter resource;
|
||||||
|
|
||||||
|
const int max_size = 10000000;
|
||||||
|
|
||||||
|
std::vector<int> v(max_size);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = -i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::make_heap(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "make_heap_reverse", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::make_heap(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "make_heap_forwards", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
// a simple psuedo-random series which does not rely on rand() and friends
|
||||||
|
v[0] = 0;
|
||||||
|
for (int i = 1; i < max_size; ++i)
|
||||||
|
v[i] = (v[i-1] + 110211473) * 745988807;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::make_heap(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "make_heap_random", time, resource);
|
||||||
|
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::sort_heap(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "sort_heap", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,65 @@
|
||||||
|
// Copyright (C) 2013 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 3, 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 COPYING3. If not see
|
||||||
|
// <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <algorithm>
|
||||||
|
#include <testsuite_performance.h>
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
using namespace __gnu_test;
|
||||||
|
|
||||||
|
time_counter time;
|
||||||
|
resource_counter resource;
|
||||||
|
|
||||||
|
const int max_size = 10000000;
|
||||||
|
|
||||||
|
std::vector<int> v(max_size);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = -i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::stable_sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "reverse", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
for (int i = 0; i < max_size; ++i)
|
||||||
|
v[i] = i;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::stable_sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "forwards", time, resource);
|
||||||
|
clear_counters(time, resource);
|
||||||
|
|
||||||
|
// a simple psuedo-random series which does not rely on rand() and friends
|
||||||
|
v[0] = 0;
|
||||||
|
for (int i = 1; i < max_size; ++i)
|
||||||
|
v[i] = (v[i-1] + 110211473) * 745988807;
|
||||||
|
|
||||||
|
start_counters(time, resource);
|
||||||
|
std::stable_sort(v.begin(), v.end());
|
||||||
|
stop_counters(time, resource);
|
||||||
|
|
||||||
|
report_performance(__FILE__, "random", time, resource);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue