]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/sort/benchmark/single/benchmark_numbers.cpp
1 //----------------------------------------------------------------------------
2 /// @file benchmark_numbers.cpp
3 /// @brief Benchmark of several sort methods with integer objects
5 /// @author Copyright (c) 2017 Francisco José Tapia (fjtapia@gmail.com )\n
6 /// Distributed under the Boost Software License, Version 1.0.\n
7 /// ( See accompanying file LICENSE_1_0.txt or copy at
8 /// http://www.boost.org/LICENSE_1_0.txt )
10 /// This program use for comparison purposes, the Threading Building
11 /// Blocks which license is the GNU General Public License, version 2
12 /// as published by the Free Software Foundation.
17 //-----------------------------------------------------------------------------
26 #include <boost/sort/common/time_measure.hpp>
27 #include <boost/sort/common/file_vector.hpp>
28 #include <boost/sort/common/int_array.hpp>
30 #include <boost/sort/sort.hpp>
32 #define NELEM 100000000
35 namespace bsort
= boost::sort
;
36 namespace bsc
= boost::sort::common
;
38 using bsc::time_point
;
40 using bsc::subtract_time
;
41 using bsc::fill_vector_uint64
;
42 using bsc::write_file_uint64
;
44 using bsort::spinsort
;
45 using bsort::flat_stable_sort
;
46 using bsort::spreadsort::spreadsort
;
49 void Generator_random (void);
50 void Generator_sorted (void);
51 void Generator_sorted_end (size_t n_last
);
52 void Generator_sorted_middle (size_t n_last
);
53 void Generator_reverse_sorted (void);
54 void Generator_reverse_sorted_end (size_t n_last
);
55 void Generator_reverse_sorted_middle (size_t n_last
);
57 template<class IA
, class compare
>
58 int Test (std::vector
<IA
> &B
, compare comp
= compare ());
60 int main (int argc
, char *argv
[])
63 cout
<< "************************************************************\n";
65 cout
<< "** B O O S T S O R T **\n";
66 cout
<< "** S I N G L E T H R E A D **\n";
67 cout
<< "** I N T E G E R B E N C H M A R K **\n";
69 cout
<< "** SORT OF 100 000 000 NUMBERS OF 64 BITS **\n";
71 cout
<< "************************************************************\n";
74 cout
<<"[ 1 ] std::sort [ 2 ] pdqsort [ 3 ] std::stable_sort \n";
75 cout
<<"[ 4 ] spinsort [ 5 ] flat_stable_sort [ 6 ] spreadsort\n\n";
76 cout
<<" | | | | | | |\n";
77 cout
<<" | [ 1 ]| [ 2 ]| [ 3 ]| [ 4 ]| [ 5 ]| [ 6 ]|\n";
78 cout
<<"--------------------+------+------+------+------+------+------+\n";
79 std::string empty_line
=
87 cout
<<"sorted + 0.1% end |";
88 Generator_sorted_end (NELEM
/ 1000);
90 cout
<<"sorted + 1% end |";
91 Generator_sorted_end (NELEM
/ 100);
93 cout
<<"sorted + 10% end |";
94 Generator_sorted_end (NELEM
/ 10);
97 cout
<<"sorted + 0.1% mid |";
98 Generator_sorted_middle (NELEM
/ 1000);
100 cout
<<"sorted + 1% mid |";
101 Generator_sorted_middle (NELEM
/ 100);
103 cout
<<"sorted + 10% mid |";
104 Generator_sorted_middle (NELEM
/ 10);
107 cout
<<"reverse sorted |";
108 Generator_reverse_sorted ();
110 cout
<<"rv sorted + 0.1% end|";
111 Generator_reverse_sorted_end (NELEM
/ 1000);
113 cout
<<"rv sorted + 1% end|";
114 Generator_reverse_sorted_end (NELEM
/ 100);
116 cout
<<"rv sorted + 10% end|";
117 Generator_reverse_sorted_end (NELEM
/ 10);
120 cout
<<"rv sorted + 0.1% mid|";
121 Generator_reverse_sorted_middle (NELEM
/ 1000);
123 cout
<<"rv sorted + 1% mid|";
124 Generator_reverse_sorted_middle (NELEM
/ 100);
126 cout
<<"rv sorted + 10% mid|";
127 Generator_reverse_sorted_middle (NELEM
/ 10);
128 cout
<<"--------------------+------+------+------+------+------+------+\n";
133 Generator_random (void)
138 if (fill_vector_uint64 ("input.bin", A
, NELEM
) != 0)
140 std::cout
<< "Error in the input file\n";
143 Test
<uint64_t, std::less
<uint64_t>> (A
);
147 Generator_sorted (void)
153 for (size_t i
= 0; i
< NELEM
; ++i
)
155 Test
<uint64_t, std::less
<uint64_t>> (A
);
159 void Generator_sorted_end (size_t n_last
)
164 if (fill_vector_uint64 ("input.bin", A
, NELEM
+ n_last
) != 0)
166 std::cout
<< "Error in the input file\n";
169 std::sort (A
.begin (), A
.begin () + NELEM
);
171 Test
<uint64_t, std::less
<uint64_t>> (A
);
175 void Generator_sorted_middle (size_t n_last
)
177 vector
<uint64_t> A
, B
, C
;
180 if (fill_vector_uint64 ("input.bin", A
, NELEM
+ n_last
) != 0)
182 std::cout
<< "Error in the input file\n";
185 for (size_t i
= NELEM
; i
< A
.size (); ++i
)
186 B
.push_back (std::move (A
[i
]));
188 for (size_t i
= 0; i
< (NELEM
>> 1); ++i
)
189 std::swap (A
[i
], A
[NELEM
- 1 - i
]);
191 std::sort (A
.begin (), A
.end ());
192 size_t step
= NELEM
/ n_last
+ 1;
195 for (size_t i
= 0; i
< B
.size (); ++i
, pos
+= step
)
198 for (size_t k
= 0; k
< step
; ++k
)
199 C
.push_back (A
[pos
+ k
]);
201 while (pos
< A
.size ())
202 C
.push_back (A
[pos
++]);
204 Test
<uint64_t, std::less
<uint64_t>> (A
);
207 void Generator_reverse_sorted (void)
213 for (size_t i
= NELEM
; i
> 0; --i
)
215 Test
<uint64_t, std::less
<uint64_t>> (A
);
217 void Generator_reverse_sorted_end (size_t n_last
)
222 if (fill_vector_uint64 ("input.bin", A
, NELEM
+ n_last
) != 0)
224 std::cout
<< "Error in the input file\n";
227 std::sort (A
.begin (), A
.begin () + NELEM
);
228 for (size_t i
= 0; i
< (NELEM
>> 1); ++i
)
229 std::swap (A
[i
], A
[NELEM
- 1 - i
]);
231 Test
<uint64_t, std::less
<uint64_t>> (A
);
233 void Generator_reverse_sorted_middle (size_t n_last
)
235 vector
<uint64_t> A
, B
, C
;
238 if (fill_vector_uint64 ("input.bin", A
, NELEM
+ n_last
) != 0)
240 std::cout
<< "Error in the input file\n";
243 for (size_t i
= NELEM
; i
< A
.size (); ++i
)
244 B
.push_back (std::move (A
[i
]));
246 for (size_t i
= 0; i
< (NELEM
>> 1); ++i
)
247 std::swap (A
[i
], A
[NELEM
- 1 - i
]);
249 std::sort (A
.begin (), A
.end ());
250 size_t step
= NELEM
/ n_last
+ 1;
253 for (size_t i
= 0; i
< B
.size (); ++i
, pos
+= step
)
256 for (size_t k
= 0; k
< step
; ++k
)
257 C
.push_back (A
[pos
+ k
]);
259 while (pos
< A
.size ())
260 C
.push_back (A
[pos
++]);
262 Test
<uint64_t, std::less
<uint64_t>> (A
);
266 template<class IA
, class compare
>
267 int Test (std::vector
<IA
> &B
, compare comp
)
268 { //---------------------------- begin --------------------------------
270 time_point start
, finish
;
271 std::vector
<IA
> A (B
);
272 std::vector
<double> V
;
274 //--------------------------------------------------------------------
277 std::sort (A
.begin (), A
.end (), comp
);
279 duration
= subtract_time (finish
, start
);
280 V
.push_back (duration
);
284 pdqsort (A
.begin (), A
.end (), comp
);
286 duration
= subtract_time (finish
, start
);
287 V
.push_back (duration
);
291 std::stable_sort (A
.begin (), A
.end (), comp
);
293 duration
= subtract_time (finish
, start
);
294 V
.push_back (duration
);
298 spinsort(A
.begin (), A
.end (), comp
);
300 duration
= subtract_time (finish
, start
);
301 V
.push_back (duration
);
305 flat_stable_sort (A
.begin (), A
.end (), comp
);
307 duration
= subtract_time (finish
, start
);
308 V
.push_back (duration
);
313 spreadsort (A
.begin (), A
.end ());
315 duration
= subtract_time (finish
, start
);
316 V
.push_back (duration
);
318 //-----------------------------------------------------------------------
319 // printing the vector
320 //-----------------------------------------------------------------------
321 std::cout
<<std::setprecision(2)<<std::fixed
;
322 for ( uint32_t i
=0 ; i
< V
.size() ; ++i
)
323 { std::cout
<<std::right
<<std::setw(5)<<V
[i
]<<" |";
325 std::cout
<<std::endl
;