]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp
2 // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 #include <boost/beast/core/flat_buffer.hpp>
11 #include <boost/beast/core/multi_buffer.hpp>
12 #include <boost/beast/core/read_size.hpp>
13 #include <boost/beast/core/string.hpp>
14 #include <boost/beast/unit_test/suite.hpp>
15 #include <boost/asio/streambuf.hpp>
26 class buffers_test
: public beast::unit_test::suite
29 using size_type
= std::uint64_t;
34 std::chrono::system_clock
;
36 clock_type::time_point when_
;
43 : when_(clock_type::now())
50 return clock_type::now() - when_
;
56 throughput(std::chrono::duration
<
57 double> const& elapsed
, size_type items
)
59 using namespace std::chrono
;
60 return static_cast<size_type
>(
61 1 / (elapsed
/items
).count());
64 template<class MutableBufferSequence
>
67 fill(MutableBufferSequence
const& buffers
)
70 for(auto b
: beast::detail::buffers_range(buffers
))
73 reinterpret_cast<char*>(b
.data()),
74 reinterpret_cast<char*>(b
.data()) +
81 template<class DynamicBuffer
>
83 do_prepares(std::size_t repeat
,
84 std::size_t count
, std::size_t size
)
88 for(auto i
= repeat
; i
--;)
91 for(auto j
= count
; j
--;)
93 auto const n
= fill(b
.prepare(size
));
98 return throughput(t
.elapsed(), total
);
101 template<class DynamicBuffer
>
103 do_hints(std::size_t repeat
,
104 std::size_t count
, std::size_t size
)
108 for(auto i
= repeat
; i
--;)
111 for(auto j
= count
; j
--;)
113 for(auto remain
= size
; remain
;)
115 auto const n
= fill(b
.prepare(
116 read_size(b
, remain
)));
123 return throughput(t
.elapsed(), total
);
126 template<class DynamicBuffer
>
128 do_random(std::size_t repeat
,
129 std::size_t count
, std::size_t size
)
133 for(auto i
= repeat
; i
--;)
136 for(auto j
= count
; j
--;)
138 auto const n
= fill(b
.prepare(
139 1 + (rand()%(2*size
))));
144 return throughput(t
.elapsed(), total
);
154 template<class F0
, class... FN
>
156 do_trials_1(bool print
, F0
&& f
, FN
... fn
)
159 using namespace std::chrono
;
160 static size_type
constexpr den
= 1024 * 1024;
163 log
<< std::right
<< std::setw(10) <<
164 ((f() + (den
/ 2)) / den
) << " MB/s";
171 do_trials_1(print
, fn
...);
174 template<class F0
, class... FN
>
176 do_trials(string_view name
,
177 std::size_t trials
, F0
&& f0
, FN
... fn
)
179 using namespace std::chrono
;
181 do_trials_1(false, f0
, fn
...);
182 do_trials_1(false, f0
, fn
...);
186 log
<< std::left
<< std::setw(24) << name
<< ":";
188 do_trials_1(true, f0
, fn
...);
190 duration_cast
<milliseconds
>(t
.elapsed()).count() << "ms";
198 static std::size_t constexpr trials
= 1;
199 static std::size_t constexpr repeat
= 250;
200 std::vector
<std::pair
<std::size_t, std::size_t>> params
;
201 params
.emplace_back(1024, 1024);
202 params
.emplace_back(512, 4096);
203 params
.emplace_back(256, 32768);
205 for(auto const& param
: params
)
207 auto const count
= param
.first
;
208 auto const size
= param
.second
;
209 auto const s
= std::string("count=") + std::to_string(count
) +
210 ", size=" + std::to_string(size
);
211 log
<< std::left
<< std::setw(24) << s
<< " " <<
212 std::right
<< std::setw(15) << "prepare" <<
213 std::right
<< std::setw(15) << "with hint" <<
214 std::right
<< std::setw(15) << "random" <<
216 do_trials("multi_buffer", trials
,
217 [&](){ return do_prepares
<multi_buffer
>(repeat
, count
, size
); }
218 ,[&](){ return do_hints
<multi_buffer
>(repeat
, count
, size
); }
219 ,[&](){ return do_random
<multi_buffer
>(repeat
, count
, size
); }
221 do_trials("flat_buffer", trials
,
222 [&](){ return do_prepares
<flat_buffer
>(repeat
, count
, size
); }
223 ,[&](){ return do_hints
<flat_buffer
>(repeat
, count
, size
); }
224 ,[&](){ return do_random
<flat_buffer
>(repeat
, count
, size
); }
226 do_trials("boost::asio::streambuf", trials
,
227 [&](){ return do_prepares
<boost::asio::streambuf
>(repeat
, count
, size
); }
228 ,[&](){ return do_hints
<boost::asio::streambuf
>(repeat
, count
, size
); }
229 ,[&](){ return do_random
<boost::asio::streambuf
>(repeat
, count
, size
); }
237 BEAST_DEFINE_TESTSUITE(beast
,benchmarks
,buffers
);