繁体   English   中英

如何提高Boost ASIO,UDP客户端应用程序的吞吐量

[英]How to increase throughput of Boost ASIO, UDP client application

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

我想使用异步接收调用,这样我最终可以实现接收超时,即。 经过一段时间后,如果没有收到数据报,我的申请将退出。

我的问题是,使用同步接收和异步接收,我看到的数据吞吐量提高了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<> s。 如果是这样,这些都是更多延迟的来源(由于参考的局部性降低,动态分配更多等)。

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

即使您拥有有限数量的基本上单线程,顺序运行的任务,您也可以通过为每个线程创建一个线程,每个线程的io_service并避免协调来实现io_service

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM