14#include <boost/asio/post.hpp>
19using namespace std::chrono_literals;
23 std::vector<uint32_t> v(size/
sizeof(uint32_t), 42u);
25 EXPECT_EQ(msg.
size(), size);
35 Benchmark(uint16_t port,
size_t message_size,
double success_ratio)
49 carla::SharedBufferView BufView = carla::BufferView::CreateFrom(std::move(msg));
50 DEBUG_ASSERT_EQ(BufView->size(), _message->size());
51 boost::asio::post(_client_callback, [this]() {
52 CARLA_PROFILE_FPS(client, listen_callback);
53 ++_number_of_messages_received;
62 for (
auto i = 0u; i < count; ++i) {
68 void Run(
size_t number_of_messages) {
69 _threads.CreateThread([
this]() { _client_callback.run(); });
70 _server.AsyncRun(_streams.size());
71 _client.AsyncRun(_streams.size());
73 std::this_thread::sleep_for(1s);
76 for (
auto &&stream : _streams) {
77 _threads.CreateThread([=]()
mutable {
78 for (
auto i = 0u; i < number_of_messages; ++i) {
79 std::this_thread::sleep_for(11ms);
82 stream.Write(_message);
89 const auto expected_number_of_messages = _streams.size() * number_of_messages;
90 const auto threshold =
91 static_cast<size_t>(_success_ratio *
static_cast<double>(expected_number_of_messages));
94 for (
auto i = 0u; i < 10; ++i) {
95 std::cout <<
"received " << _number_of_messages_received
96 <<
" of " << expected_number_of_messages
98 if (_number_of_messages_received >= expected_number_of_messages) {
101 std::cout <<
" waiting..." << std::endl;
102 std::this_thread::sleep_for(1s);
105 _client_callback.stop();
107 std::cout <<
" done." << std::endl;
110 ASSERT_GE(_number_of_messages_received, threshold);
114 if (_number_of_messages_received < threshold) {
138 std::atomic_size_t _number_of_messages_received{0u};
143 size_t concurrency = std::thread::hardware_concurrency() / 2u;
144 return std::max((
size_t) 2u, concurrency);
149 const size_t dimensions,
150 const size_t number_of_streams = 1u,
151 const double success_ratio = 1.0) {
152 constexpr auto number_of_messages = 100u;
156 benchmark.
Run(number_of_messages);
159TEST(benchmark_streaming, image_200x200) {
163TEST(benchmark_streaming, image_800x600) {
167TEST(benchmark_streaming, image_1920x1080) {
171TEST(benchmark_streaming, image_200x200_mt) {
175TEST(benchmark_streaming, image_800x600_mt) {
179TEST(benchmark_streaming, image_1920x1080_mt) {
#define CARLA_PROFILE_SCOPE(context, profiler_name)
Benchmark(uint16_t port, size_t message_size, double success_ratio)
void Run(size_t number_of_messages)
const carla::SharedBufferView _message
boost::asio::io_context _client_callback
std::vector< Stream > _streams
void AddStreams(size_t count)
carla::ThreadGroup _threads
const double _success_ratio
boost::asio::io_context::work _work_to_do
static std::shared_ptr< BufferView > CreateFrom(Buffer &&buffer)
一块原始数据。 请注意,如果需要更多容量,则会分配一个新的内存块,并 删除旧的内存块。这意味着默认情况下,缓冲区只能增长。要释放内存,使用 clear 或 pop。
size_type size() const noexcept
void Subscribe(const Token &token, Functor &&callback)
Token token() const
与此流关联的 Token。客户端可使用该 Token 订阅此流。
static void log(Args &&... args)
std::shared_ptr< BufferView > SharedBufferView
static void log_warning(Args &&... args)
constexpr uint16_t TESTING_PORT
static auto make_special_message(size_t size)
static void benchmark_image(const size_t dimensions, const size_t number_of_streams=1u, const double success_ratio=1.0)
static size_t get_max_concurrency()
TEST(benchmark_streaming, image_200x200)