Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost asio异步udp服务器-性能差_C++_Performance_Asynchronous_Udp_Boost Asio - Fatal编程技术网

C++ boost asio异步udp服务器-性能差

C++ boost asio异步udp服务器-性能差,c++,performance,asynchronous,udp,boost-asio,C++,Performance,Asynchronous,Udp,Boost Asio,我编写了一个boost asio async udp服务器,并测量了从收到返回的ping消息到发送短ping消息之前客户端上的时间。我在我的家庭网络中测量了这一点,所以我期望结果会非常好 不幸的是,消息到达我的另一台计算机并返回的平均时间总是在4ms左右(在两个不同的本地网络中测试) 在我编写尽可能最简单的服务器时,我现在想知道是否以及如何提高性能 .hpp: class udp_server2 { boost::asio::ip::udp::socket socket; boo

我编写了一个boost asio async udp服务器,并测量了从收到返回的ping消息到发送短ping消息之前客户端上的时间。我在我的家庭网络中测量了这一点,所以我期望结果会非常好

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

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

.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);
};
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);
    }
}
.cpp

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);
};
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服务器的性能是否可以显著提高,或者我是否必须切换到另一个库?

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


我得到了0.2毫秒的响应时间。因此,我得出结论,性能差是由于网络延迟造成的。在这两种测试环境中,fritzbox被用作路由器,因此这可能是瓶颈。

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


我得到了0.2毫秒的响应时间。因此,我得出结论,性能差是由于网络延迟造成的。在这两种测试环境中,fritzbox都被用作路由器,因此这可能是瓶颈。

这种性能差的原因是网络本身吗?嗯,正如我所说,我在两个单独的网络上进行了测试。我也不确定最短需要多少时间。事实上,如果你的两个独立网络具有相同的特征。。。根据我的经验,网络限制往往是瓶颈。但我又不是这方面的专家,只是表达了我迄今为止的大部分经历。不管怎样,你这里有个有趣的问题。Upvote和favorite,当然想得到答案。这种糟糕的性能可以由网络本身来解释吗?嗯,正如我说的,我在两个独立的网络上进行了测试。我也不确定最短需要多少时间。事实上,如果你的两个独立网络具有相同的特征。。。根据我的经验,网络限制往往是瓶颈。但我又不是这方面的专家,只是表达了我迄今为止的大部分经历。不管怎样,你这里有个有趣的问题。向上投票和喜爱,绝对想得到答案