缓慢提升ASIO
Boost ASIO slow
我在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
的输出和断言未激发的事实中看到的那样。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 提升 ASIO 无法识别计时器对象
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 缓慢提升ASIO
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- C++ Boost::asio串行通信与Arduino无法写入
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 提升 Asio TCP 服务器 处理多个客户端
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 提升 ASIO - io_service 不要等待连接到线程
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 使用istringstearm和get行缓慢读取文件
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()