【问题标题】:boost asio async udp server - poor performance提升 asio 异步 udp 服务器 - 性能不佳
【发布时间】:2015-08-21 23:24:51
【问题描述】:

我编写了一个 boost asio 异步 udp 服务器,并测量了客户端上从发送短 ping 消息之前到收到返回的 ping 消息之后的时间。我在我的家庭网络中对此进行了测量,因此我预计结果会非常好。

不幸的是,消息到达我的另一台计算机并返回的平均时间总是在 4 毫秒左右(在 2 个不同的本地网络中测试)。

当我编写尽可能简单的服务器时,我现在想知道是否以及如何提高性能。

.hpp

class udp_server2 {
    boost::asio::ip::udp::socket socket;
    boost::asio::streambuf read_buffer;
    boost::asio::ip::udp::endpoint read_endpoint;

    void receive();
    void handle_receive(const boost::system::error_code& ec, std::size_t bytes_transferred);
    void send(const boost::asio::ip::udp::endpoint& endpoint, const boost::asio::streambuf& data);
    void handle_send(const boost::system::error_code& ec, std::size_t bytes_transferred);

public:
    udp_server2(boost::asio::io_service& io_service);
};

.cpp

udp_server2::udp_server2(boost::asio::io_service& io_service) :
    socket(io_service, boost::asio::ip::udp::endpoint(boost::asio::ip::udp::v4(), 1337)) {
    receive();
}


void udp_server2::receive() {
    socket.async_receive_from(read_buffer.prepare(10000), read_endpoint, boost::bind(&udp_server2::handle_receive, this, _1, _2));
}

void udp_server2::handle_receive(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        read_buffer.commit(14);
        send(read_endpoint, read_buffer);
    }
    receive();
}

void udp_server2::send(const boost::asio::ip::udp::endpoint& endpoint, const boost::asio::streambuf& data) {
    socket.async_send_to(read_buffer.data(), endpoint, boost::bind(&udp_server2::handle_send, this, _1, _2));
}

void udp_server2::handle_send(const boost::system::error_code& error, std::size_t bytes_transferred) {
    if (!error) {
        read_buffer.consume(14);
    }
}

这台 asio 服务器的性能能否得到显着提升,还是我必须切换到另一个库?

【问题讨论】:

  • 网络本身可以解释这种糟糕的性能吗?
  • 嗯,正如我所说,我在两个不同的网络上进行了测试。我也不确定所需的最短时间是多少。
  • 确实,但如果您的两个独立网络具有相同的特征......根据我的经验,网络限制通常是瓶颈。但话又说回来,我不是这方面的专家,只是表达我迄今为止所经历的大部分事情。无论如何,你在这里有一个有趣的问题。点赞收藏,肯定想得到答案

标签: c++ performance asynchronous udp boost-asio


【解决方案1】:

经过进一步调查,我尝试在同一台计算机上运行客户端和服务器(通过本地主机)。

我的响应时间为 0.2 毫秒。所以我得出结论,性能不佳实际上是由于网络延迟。在这两个测试环境中,fritzbox 都被用作路由器,所以这可能是瓶颈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    • 2010-12-16
    • 2015-08-07
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多