【问题标题】:Boost ASIO slow提升 ASIO 慢
【发布时间】:2018-10-30 08:57:11
【问题描述】:

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

【问题讨论】:

  • 慢有多慢?你测量了什么?
  • 20,000 个请求在 658 毫秒内处理,即 30,396 个请求/秒(主要是 asio 读取和写入)。这并不可怕,但与每秒能够处理超过 66,000 个请求的 redis-benchmark 相比,我认为它可能会更好。
  • 代码不处理请求。完全没有。你的意思是你在发送 redis请求吗?你怎么知道它什么时候被处理?发送了多少线程?很可能您只需要 1 个线程,并改用 async_ 操作。
  • redis req/sec 只是为了比较,我管理的根本不是完美的。我可以试试 async_ 操作,谢谢。

标签: c++ performance networking boost-asio


【解决方案1】:

首先,没有测量,您将无处可去。你能证明它不必要地慢吗?

其次,一定要使用 scatter-gather 和 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 的输出中看到,并且断言不会触发。

【讨论】:

猜你喜欢
  • 2016-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 2016-05-02
  • 2010-12-16
相关资源
最近更新 更多