【问题标题】:Why does boost::asio::ip::tcp::basic_stream_socket::available have a long runtime?为什么 boost::asio::ip::tcp::basic_stream_socket::available 运行时间长?
【发布时间】:2020-05-25 19:47:06
【问题描述】:

boost::asio::ip::tcp::basic_stream_socket::available 方法大约需要 3us 才能完成。这个时间量并不是特别慢,但仍然比我预期的只返回状态的方法调用要慢。需要这么长时间的原因是什么?它使用锁吗?如果是这样,并行的多个调用是否会相互锁定争用?

【问题讨论】:

  • 与任何与性能相关的问题一样,第一个问题必须是“您是否测试了优化的发布版本或(编译器默认)未优化的调试版本”?测试未优化的构建是毫无意义的。
  • 我使用-O3 标志来编译我的代码。对于 boost,我使用boost.org/doc/libs/1_66_0/more/getting_started/… 的默认说明安装了它。该页面没有讨论优化,但由于 Boost 库主要是仅标头,它可能相当没有实际意义。
  • 好的。我只是想获取信息,因为您的原始问题没有提供它,人们问“为什么我的代码性能不佳?”真的很常见,只是为了发现他们甚至没有启用优化器这样做就可以解决问题。
  • 就像 sehe 指出的那样,这是一个系统调用。是的,套接字子系统中有锁。以太网卡从不休眠。 :)

标签: c++ boost-asio boost-beast


【解决方案1】:

我会说这并不重要。为了直接回答这个问题,以下是对反应式套接字实现(例如 Linux)进行的预处理和重新格式化:

size_t available(socket_type s, boost::system::error_code& ec) {
    if (s == invalid_socket) {
        ec = boost::asio::error::bad_descriptor;
        return 0;
    }
    ioctl_arg_type value = 0;
    int result = error_wrapper(::ioctl(s, FIONREAD, &value), ec);
    if (result == 0)
        ec = boost::system::error_code();
    return ec ? static_cast<size_t>(0) : static_cast<size_t>(value);
}

如您所见,它应该全部内联到直接的 FIONREAD ioctl,除非出现错误情况。这很简单,如果你直接做的话不会花费更少的时间,以防你想检查:

static inline size_t my_available(boost::asio::ip::tcp::socket& socket, boost::system::error_code& ec) {
    auto s = socket.native_handle();
    if (s == -1) {
        ec = boost::asio::error::bad_descriptor;
        return 0;
    }
    int value = 0;
    if (auto err = ::ioctl(s, FIONREAD, &value))
        ec = boost::system::error_code(err, boost::asio::error::get_system_category());
    else
        ec = boost::system::error_code();
    return ec? value : 0;
}

Reactor Style Operations

如果您想等到数据可用并第一时间采取行动,那么您可以在套接字上async_waithttps://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/reference/basic_stream_socket/async_wait.html

您可以指定等待读/写可用性,或者当存在未决错误条件时

文档:https://www.boost.org/doc/libs/1_73_0/doc/html/boost_asio/overview/core/reactor.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多