代码之家  ›  专栏  ›  技术社区  ›  Jason

加速ASIO慢

  •  0
  • Jason  · 技术社区  · 6 年前

    我在本地主机上使用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));
    

    原因是先发送数据的大小,然后发送数据本身。这是低效的吗?如果是这样的话,有什么更有效的方法?

    我已将“不延迟”设置为“真”,这有很大帮助,但还不够。

    1 回复  |  直到 6 年前
        1
  •  1
  •   sehe    6 年前

    首先,如果没有测量,你就一无所有。你能证明吗 不必要的 慢?

    其次,一定要使用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 断言不会被激发。