14#include <boost/asio/executor_work_guard.hpp>
15#include <boost/asio/post.hpp>
20using namespace std::chrono_literals;
23 std::vector<uint32_t> v(size/
sizeof(uint32_t), 42u);
25 EXPECT_EQ(msg.
size(), size);
34 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;
61 for (
auto i = 0u; i < count; ++i) {
66 void Run(
size_t number_of_messages) {
67 _threads.CreateThread([
this]() { _client_callback.run(); });
68 _server.AsyncRun(_streams.size());
69 _client.AsyncRun(_streams.size());
71 std::this_thread::sleep_for(1s);
74 for (
auto &&stream : _streams) {
75 _threads.CreateThread([=]()
mutable {
76 for (
auto i = 0u; i < number_of_messages; ++i) {
77 std::this_thread::sleep_for(11ms);
80 stream.Write(_message);
86 const auto expected_number_of_messages = _streams.size() * number_of_messages;
87 const auto threshold =
88 static_cast<size_t>(_success_ratio *
static_cast<double>(expected_number_of_messages));
90 for (
auto i = 0u; i < 10; ++i) {
91 std::cout <<
"received " << _number_of_messages_received
92 <<
" of " << expected_number_of_messages
94 if (_number_of_messages_received >= expected_number_of_messages) {
97 std::cout <<
" waiting..." << std::endl;
98 std::this_thread::sleep_for(1s);
101 _client_callback.stop();
103 std::cout <<
" done." << std::endl;
106 ASSERT_GE(_number_of_messages_received, threshold);
108 if (_number_of_messages_received < threshold) {
126 boost::asio::executor_work_guard<boost::asio::io_context::executor_type>
_work_to_do;
132 std::atomic_size_t _number_of_messages_received{0u};
136 size_t concurrency = std::thread::hardware_concurrency() / 2u;
137 return std::max(
static_cast<size_t>(2u), concurrency);
141 const size_t dimensions,
142 const size_t number_of_streams = 1u,
143 const double success_ratio = 1.0) {
144 constexpr auto number_of_messages = 100u;
148 benchmark.
Run(number_of_messages);
151TEST(benchmark_streaming, image_200x200) {
155TEST(benchmark_streaming, image_800x600) {
159TEST(benchmark_streaming, image_1920x1080) {
163TEST(benchmark_streaming, image_200x200_mt) {
167TEST(benchmark_streaming, image_800x600_mt) {
171TEST(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
boost::asio::executor_work_guard< boost::asio::io_context::executor_type > _work_to_do
const double _success_ratio
static std::shared_ptr< BufferView > CreateFrom(Buffer &&buffer)
size_type size() const noexcept
A client able to subscribe to multiple streams.
void Subscribe(const Token &token, Functor &&callback)
void SetSynchronousMode(bool is_synchro)
Token token() const
Token associated with this stream.
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)