1 // Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
3 // This file is part of the GNU ISO C++ Library. This library is free
4 // software; you can redistribute it and/or modify it under the
5 // terms of the GNU General Public License as published by the
6 // Free Software Foundation; either version 2, or (at your option)
9 // This library is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 // GNU General Public License for more details.
14 // You should have received a copy of the GNU General Public License along
15 // with this library; see the file COPYING. If not, write to the Free
16 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
19 // As a special exception, you may use this file as part of a free software
20 // library without restriction. Specifically, if other files instantiate
21 // templates or use macros or inline functions from this file, or you compile
22 // this file and link it with other files to produce an executable, this
23 // file does not by itself cause the resulting executable to be covered by
24 // the GNU General Public License. This exception does not however
25 // invalidate any other reasons why the executable file might be covered by
26 // the GNU General Public License.
29 * The goal with this application is to compare the performance
30 * between different std::allocator implementations. The results are
31 * influenced by the underlying allocator in the "C" library, malloc.
34 // 2003-02-05 Stefan Olsson <stefan@snon.net>
43 #include <ext/mt_allocator.h>
44 #include <ext/new_allocator.h>
45 #include <ext/malloc_allocator.h>
46 #include <ext/bitmap_allocator.h>
47 #include <ext/pool_allocator.h>
49 #include <testsuite_performance.h>
53 typedef int test_type
;
55 // The number of iterations to be performed.
56 int iterations
= 10000;
58 // The number of values to insert in the container, 32 will cause 5
59 // (re)allocations to be performed (sizes 4, 8, 16, 32 and 64)
60 // This means that all allocations are within _MAX_BYTES = 128 as
61 // defined in stl_alloc.h for __pool_alloc. Whether or not this
62 // value is relevant in "the real world" or not I don't know and
63 // should probably be investigated in more detail.
64 int insert_values
= 128;
66 template<typename TestType
>
67 struct value_type
: public pair
<TestType
, TestType
>
69 value_type() : pair
<TestType
, TestType
>(0, 0) { }
71 inline value_type
operator++() { return ++this->first
, *this; }
72 inline operator TestType() const { return this->first
; }
75 template<typename Container
>
80 int test_iterations
= 0;
81 value_type
<test_type
> test_value
;
82 while (test_iterations
< iterations
)
84 for (int j
= 0; j
< insert_values
; ++j
)
85 obj
.insert(obj
.end(), ++test_value
);
90 template<typename Container
>
92 do_test(void* p
= NULL
)
98 template<typename Container
>
100 test_container(Container obj
, bool run_threaded
= false)
102 using namespace __gnu_test
;
106 resource_counter resource
;
108 start_counters(time
, resource
);
111 do_loop
<Container
>();
115 #if defined (_GLIBCXX_GCC_GTHR_POSIX_H) && !defined (NOTHREAD)
116 pthread_t t1
, t2
, t3
, t4
;
117 pthread_create(&t1
, 0, &do_test
<Container
>, 0);
118 pthread_create(&t2
, 0, &do_test
<Container
>, 0);
119 pthread_create(&t3
, 0, &do_test
<Container
>, 0);
120 pthread_create(&t4
, 0, &do_test
<Container
>, 0);
122 pthread_join(t1
, NULL
);
123 pthread_join(t2
, NULL
);
124 pthread_join(t3
, NULL
);
125 pthread_join(t4
, NULL
);
128 stop_counters(time
, resource
);
130 std::ostringstream comment
;
132 comment
<< "4-way threaded iterations: " << iterations
*4 << '\t';
134 comment
<< "iterations: " << iterations
<< '\t';
135 comment
<< "type: " << abi::__cxa_demangle(typeid(obj
).name(),
137 report_header(__FILE__
, comment
.str());
138 report_performance(__FILE__
, string(), time
, resource
);
142 // http://gcc.gnu.org/ml/libstdc++/2001-05/msg00105.html
143 // http://gcc.gnu.org/ml/libstdc++/2003-05/msg00231.html
146 typedef __gnu_cxx::malloc_allocator
<test_type
> m_alloc_type
;
147 typedef __gnu_cxx::new_allocator
<test_type
> n_alloc_type
;
148 typedef __gnu_cxx::__mt_alloc
<test_type
> so_alloc_type
;
149 typedef __gnu_cxx::bitmap_allocator
<test_type
> bit_alloc_type
;
150 typedef __gnu_cxx::__pool_alloc
<test_type
> po_alloc_type
;
153 test_container(vector
<test_type
, m_alloc_type
>());
156 test_container(vector
<test_type
, n_alloc_type
>());
159 test_container(vector
<test_type
, so_alloc_type
>());
162 test_container(vector
<test_type
, bit_alloc_type
>());
165 test_container(vector
<test_type
, po_alloc_type
>());
169 test_container(list
<test_type
, m_alloc_type
>());
172 test_container(list
<test_type
, n_alloc_type
>());
175 test_container(list
<test_type
, so_alloc_type
>());
178 test_container(list
<test_type
, bit_alloc_type
>());
181 test_container(list
<test_type
, po_alloc_type
>());
185 test_container(deque
<test_type
, m_alloc_type
>());
188 test_container(deque
<test_type
, n_alloc_type
>());
191 test_container(deque
<test_type
, so_alloc_type
>());
194 test_container(deque
<test_type
, bit_alloc_type
>());
197 test_container(deque
<test_type
, po_alloc_type
>());
200 typedef less
<test_type
> compare_type
;
201 typedef pair
<const test_type
, test_type
> pair_type
;
202 typedef __gnu_cxx::malloc_allocator
<pair_type
> m_pair_alloc_type
;
203 typedef __gnu_cxx::new_allocator
<pair_type
> n_pair_alloc_type
;
204 typedef __gnu_cxx::__mt_alloc
<pair_type
> so_pair_alloc_type
;
205 typedef __gnu_cxx::bitmap_allocator
<pair_type
> bit_pair_alloc_type
;
206 typedef __gnu_cxx::__pool_alloc
<pair_type
> po_pair_alloc_type
;
209 test_container(map
<test_type
, test_type
, compare_type
,
210 m_pair_alloc_type
>());
213 test_container(map
<test_type
, test_type
, compare_type
,
214 n_pair_alloc_type
>());
217 test_container(map
<test_type
, test_type
, compare_type
,
218 so_pair_alloc_type
>());
221 test_container(map
<test_type
, test_type
, compare_type
,
222 bit_pair_alloc_type
>());
225 test_container(map
<test_type
, test_type
, compare_type
,
226 po_pair_alloc_type
>());
230 test_container(set
<test_type
, compare_type
, m_alloc_type
>());
233 test_container(set
<test_type
, compare_type
, n_alloc_type
>());
236 test_container(set
<test_type
, compare_type
, so_alloc_type
>());
239 test_container(set
<test_type
, compare_type
, bit_alloc_type
>());
242 test_container(set
<test_type
, compare_type
, po_alloc_type
>());
246 test_container(vector
<test_type
, m_alloc_type
>(), true);
249 test_container(vector
<test_type
, n_alloc_type
>(), true);
252 test_container(vector
<test_type
, so_alloc_type
>(), true);
255 test_container(vector
<test_type
, bit_alloc_type
>(), true);
258 test_container(vector
<test_type
, po_alloc_type
>(), true);
262 test_container(list
<test_type
, m_alloc_type
>(), true);
265 test_container(list
<test_type
, n_alloc_type
>(), true);
268 test_container(list
<test_type
, so_alloc_type
>(), true);
271 test_container(list
<test_type
, bit_alloc_type
>(), true);
274 test_container(list
<test_type
, po_alloc_type
>(), true);
278 test_container(deque
<test_type
, m_alloc_type
>(), true);
281 test_container(deque
<test_type
, n_alloc_type
>(), true);
284 test_container(deque
<test_type
, so_alloc_type
>(), true);
287 test_container(deque
<test_type
, bit_alloc_type
>(), true);
290 test_container(deque
<test_type
, po_alloc_type
>(), true);
294 test_container(map
<test_type
, test_type
, compare_type
,
295 m_pair_alloc_type
>(), true);
298 test_container(map
<test_type
, test_type
, compare_type
,
299 n_pair_alloc_type
>(), true);
302 test_container(map
<test_type
, test_type
, compare_type
,
303 so_pair_alloc_type
>(), true);
306 test_container(map
<test_type
, test_type
, compare_type
,
307 bit_pair_alloc_type
>(), true);
310 test_container(map
<test_type
, test_type
, compare_type
,
311 po_pair_alloc_type
>(), true);
315 test_container(set
<test_type
, compare_type
, m_alloc_type
>(), true);
318 test_container(set
<test_type
, compare_type
, n_alloc_type
>(), true);
321 test_container(set
<test_type
, compare_type
, so_alloc_type
>(), true);
324 test_container(set
<test_type
, compare_type
, bit_alloc_type
>(), true);
327 test_container(set
<test_type
, compare_type
, po_alloc_type
>(), true);