Boost ASIO медленно - PullRequest
       25

Boost ASIO медленно

0 голосов
/ 30 октября 2018

Моя работа с Boost ASIO на локальном хосте кажется медленной. Я использую две операции чтения / записи для отправки / получения данных:

boost::asio::write(socket, boost::asio::buffer((char*)&data_size_network_byte_order, sizeof(uint32)));
boost::asio::write(socket, boost::asio::buffer(results->get_data(), data_size));

Причина заключается в том, чтобы сначала отправить размер данных, а затем сами данные. Это неэффективно? Если это так, что будет более эффективным способом?

Я установил no_delay в true, и это очень помогает, но этого недостаточно.

1 Ответ

0 голосов
/ 30 октября 2018

Прежде всего, без измерений ты никуда Можете ли вы доказать, что это излишне медленно?

Во-вторых, обязательно используйте scatter-collect и составные операции записи, предоставленные ASIO. Это устраняет ваш код как источник неэффективности, а также, как правило, освобождает место для ошибок.

В этом случае

boost::asio::write(socket, boost::asio::buffer((char*)&data_size_network_byte_order, sizeof(uint32)));
boost::asio::write(socket, boost::asio::buffer(results->get_data(), data_size));

Может быть

Демо

Live On Coliru

#include <boost/asio.hpp>

int main() {
    using namespace boost::asio;
    io_context io;
    ip::tcp::socket s(io);
    s.connect({{}, 6868});

    std::string buf1 = "hello", buf2 = "world";
    std::vector<const_buffer> bufs { buffer(buf1), buffer(buf2) };
    auto written = write(s, bufs);

    assert(written == buf1.size() + buf2.size());
}

Это посылает "helloworld", как вы можете видеть по выводу netcat и тому факту, что assert не срабатывает.

...