c++ - 如何 boost Boost ASIO、UDP 客户端应用程序的吞吐量

标签 c++ asynchronous boost udp synchronous

我正在使用 Boost ASIO 库来实现需要高吞吐量的 Windows UDP 客户端。

我想使用异步接收调用,以便最终实现接收超时,即。一段时间后,如果没有收到数据报,我的应用程序将退出。

我的问题是我发现使用同步接收时数据吞吐量 boost 了 30% 与异步接收。我在运行时观察到这个问题 多台 Dell R630、R710 Windows 2008 服务器上的应用程序,甚至是我的 联想 ThinkPad 笔记本电脑。

下面两个代码段之间的主要性能差异是什么? 在每次异步接收后调用 ioService.run_one() 是否有更多开销? 我是 Boost 库的新用户,非常感谢任何帮助!

同步接收:

socket_->receive_from(boost::asio::buffer(&vector_[0], datagramSize),  
                      endPoint_);

对比

异步接收(带阻塞):

err = boost::asio::error::would_block;

socket_->async_receive_from(
    boost::asio::mutable_buffers_1(&vector_[0], datagramSize),
    endPoint_,
    boost::bind(&HandleRead, _1, _2, &err, &bytesReceived));

do
{
    ioService_.run_one()
}
while(err == boost::asio::error::would_block)

异步接收处理函数:

static void HandleRead
(
    const boost::system::error_code& error, 
    std::size_t bytesRead,
    boost::system::error_code* outError, 
    std::size_t* outBytesRead
)
{
    *outError = error;
    *outBytesRead = bytesRead;
}

最佳答案

async_ 不足为奇 API 函数系列具有最重要的属性,即它们以异步方式运行。

异步 运行任何东西本身并不会使其变得更快。事实上,由于安排人工制品,它可能会更慢。

问题是异步可以让你在少量线程(例如主线程)上做更多的事情。

听起来好像您的应用程序不需要那种多路复用操作。如果您的应用程序确实以线性方式尽可能快地消耗单个数据包源,那么

  • 插入一个(线程安全的)任务队列
  • 询问 io_service在可用的服务线程中安排任务¹(你只有一个)
  • 以回调的形式协调结果;回调经常导致对象生命周期被攻击,这反过来又经常导致 shared_ptr<>秒。如果是这样,这些都是更多延迟的来源(由于引用位置减少、更多动态分配等)。

如果不需要,请不要使用异步模式。

即使您有数量有限的基本单线程、顺序运行的任务,您也可以通过为每个任务分配一个线程来实现最大的效果,io_service每个线程并避免协调。

¹ 线程正在运行 io_service::run或类似的

关于c++ - 如何 boost Boost ASIO、UDP 客户端应用程序的吞吐量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31128014/

相关文章:

c# - 新方法 : Implementing INFINITE LOOP which can be STOPPED upon request

node.js - 无法找到一种简单的方法来摆脱每个 Node js 的多个异步(sails)

c++ - 可变模板化结构/boost::variant 是如何实现的

C++,boost asio,接收空终止字符串

c# - 如何使 Visual Studio 2010 将文件扩展名识别为 C#/ASPX/C/C++ 文件?

c++ - 在 Matlab mex 文件中编译 c++11 代码时出错

c++ - Visual Studio 2012 Professional 无法识别类 - 有时

安卓 : Retrofit Callback success and failure executed asynchronously?

c++ - 一个简单的cuda编译出错

c++ - Boost Process 库 asynch_read 处理程序未调用