缓慢提升ASIO

Boost ASIO slow

本文关键字:ASIO 缓慢      更新时间:2023-10-16

我在localhost上使用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,这有很大帮助,但还不够。

首先,如果没有测量,你将一事无成。你能证明它是不必要的慢吗?

其次,一定要使用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));

可能是

Demo

在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的输出和断言未激发的事实中看到的那样。