]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp
2 // Copyright (c) 2016-2019 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/buffers_range.hpp>
11 #include <boost/beast/core/flat_buffer.hpp>
12 #include <boost/beast/core/multi_buffer.hpp>
13 #include <boost/beast/core/read_size.hpp>
14 #include <boost/beast/core/string.hpp>
15 #include <boost/beast/_experimental/unit_test/suite.hpp>
16 #include <boost/asio/streambuf.hpp>
27 class buffers_test
: public beast::unit_test::suite
30 using size_type
= std::uint64_t;
35 std::chrono::system_clock
;
37 clock_type::time_point when_
;
44 : when_(clock_type::now())
51 return clock_type::now() - when_
;
57 throughput(std::chrono::duration
<
58 double> const& elapsed
, size_type items
)
60 using namespace std::chrono
;
61 return static_cast<size_type
>(
62 1 / (elapsed
/items
).count());
65 template<class MutableBufferSequence
>
68 fill(MutableBufferSequence
const& buffers
)
71 for(auto b
: beast::buffers_range_ref(buffers
))
74 static_cast<char*>(b
.data()),
75 static_cast<char*>(b
.data()) +
82 template<class DynamicBuffer
>
84 do_prepares(std::size_t repeat
,
85 std::size_t count
, std::size_t size
)
89 for(auto i
= repeat
; i
--;)
92 for(auto j
= count
; j
--;)
94 auto const n
= fill(b
.prepare(size
));
99 return throughput(t
.elapsed(), total
);
102 template<class DynamicBuffer
>
104 do_hints(std::size_t repeat
,
105 std::size_t count
, std::size_t size
)
109 for(auto i
= repeat
; i
--;)
112 for(auto j
= count
; j
--;)
114 for(auto remain
= size
; remain
;)
116 auto const n
= fill(b
.prepare(
117 read_size(b
, remain
)));
124 return throughput(t
.elapsed(), total
);
127 template<class DynamicBuffer
>
129 do_random(std::size_t repeat
,
130 std::size_t count
, std::size_t size
)
134 for(auto i
= repeat
; i
--;)
137 for(auto j
= count
; j
--;)
139 auto const n
= fill(b
.prepare(
140 1 + (rand()%(2*size
))));
145 return throughput(t
.elapsed(), total
);
155 template<class F0
, class... FN
>
157 do_trials_1(bool print
, F0
&& f
, FN
... fn
)
160 using namespace std::chrono
;
161 static size_type
constexpr den
= 1024 * 1024;
164 log
<< std::right
<< std::setw(10) <<
165 ((f() + (den
/ 2)) / den
) << " MB/s";
172 do_trials_1(print
, fn
...);
175 template<class F0
, class... FN
>
177 do_trials(string_view name
,
178 std::size_t trials
, F0
&& f0
, FN
... fn
)
180 using namespace std::chrono
;
182 do_trials_1(false, f0
, fn
...);
183 do_trials_1(false, f0
, fn
...);
187 log
<< std::left
<< std::setw(24) << name
<< ":";
189 do_trials_1(true, f0
, fn
...);
191 duration_cast
<milliseconds
>(t
.elapsed()).count() << "ms";
199 static std::size_t constexpr trials
= 1;
200 static std::size_t constexpr repeat
= 250;
201 std::vector
<std::pair
<std::size_t, std::size_t>> params
;
202 params
.emplace_back(1024, 1024);
203 params
.emplace_back(512, 4096);
204 params
.emplace_back(256, 32768);
206 for(auto const& param
: params
)
208 auto const count
= param
.first
;
209 auto const size
= param
.second
;
210 auto const s
= std::string("count=") + std::to_string(count
) +
211 ", size=" + std::to_string(size
);
212 log
<< std::left
<< std::setw(24) << s
<< " " <<
213 std::right
<< std::setw(15) << "prepare" <<
214 std::right
<< std::setw(15) << "with hint" <<
215 std::right
<< std::setw(15) << "random" <<
217 do_trials("multi_buffer", trials
,
218 [&](){ return do_prepares
<multi_buffer
>(repeat
, count
, size
); }
219 ,[&](){ return do_hints
<multi_buffer
>(repeat
, count
, size
); }
220 ,[&](){ return do_random
<multi_buffer
>(repeat
, count
, size
); }
222 do_trials("flat_buffer", trials
,
223 [&](){ return do_prepares
<flat_buffer
>(repeat
, count
, size
); }
224 ,[&](){ return do_hints
<flat_buffer
>(repeat
, count
, size
); }
225 ,[&](){ return do_random
<flat_buffer
>(repeat
, count
, size
); }
227 do_trials("net::streambuf", trials
,
228 [&](){ return do_prepares
<net::streambuf
>(repeat
, count
, size
); }
229 ,[&](){ return do_hints
<net::streambuf
>(repeat
, count
, size
); }
230 ,[&](){ return do_random
<net::streambuf
>(repeat
, count
, size
); }
238 BEAST_DEFINE_TESTSUITE(beast
,benchmarks
,buffers
);