我正在使用Boost ASIO库实现一个Windows UDP客户端,需要具备高吞吐量。我想使用异步接收调用,以便最终实现接收超时,即在一定时间内如果没有接收到数据报文,我的应用程序将退出。
我的问题是,使用同步接收相对于异步接收,我看到了30%的更高数据吞吐量。当我在多个Dell R630、R710 Windows 2008服务器和甚至我的Lenovo ThinkPad笔记本电脑上运行应用程序时,我观察到了这个问题。
下面两段代码之间的主要性能差异是什么?每个异步接收后调用ioService.run_one()是否有更多开销?我是Boost库的新用户,所以任何帮助都将不胜感激!
同步接收:
我的问题是,使用同步接收相对于异步接收,我看到了30%的更高数据吞吐量。当我在多个Dell R630、R710 Windows 2008服务器和甚至我的Lenovo 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;
}
operator new
进行分配。使用快速的自定义分配可以提高性能。 - Evgeny Panasyuk