我正在使用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_);
VS
异步接收(带阻塞):
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;
}
答案 0 :(得分:3)
async_
系列API函数最重要的属性是异步,这不足为奇。
异步运行任何 本身并不会让它变得更快。事实上,由于安排人工制品,它可能会更慢。
问题是异步可以允许你在少量线程上做更多的事情(例如主线程)。
听起来有点像应用程序不需要多路复用操作。如果您的应用程序确实以线性方式尽可能快地消耗单个数据包源,那么实际上它没有任何意义
io_service
安排可用服务线程中的任务¹(您只有一个)shared_ptr<>
s。如果是这样,这些都是更多延迟的原因(由于参考的局部性降低,动态分配更多等)。如果您不需要,请不要使用异步模式。
即使您的基本上是单线程,顺序运行的任务数量有限,您也可以通过为每个线程创建一个线程来实现最大效果,每个线程io_service
并避免协调。
¹线程正在运行io_service::run
或类似