我正在写一个异步日志记录框架,我有多个线程转储数据。我开始玩Boost asio,因为它提供了一些简单的方法来执行序列化和订购。因为我是初学者,所以我开始使用线程安全(使用boost::mutex
和boost:condition_variable
)circular bounded_buffer(实际上是vector)的设计。Boost ASIO IO_SERVICE实现?
我写了一个简单的基准来测量性能。基准测试只是一个记录一百万条消息的单线程(将它推入缓冲区),而我的工作线程只会从队列中获取消息以登录到文件/控制台/记录器列表。 (P.S.使用互斥体和C.V是正确的,消息的指针正在移动,所以从这个角度来看,一切都很好/有效)。
当我改变了我的执行,而不是使用boost::asio::io_service
和和具有单个线程执行run()
性能确实提高了(其实它真的缩放以及对增加在我最初的简单模型,而不是降低性能正在记录的信息的数量)
这里有几个问题,我想清除。
为什么要提高性能? (我认为
boost::asio::io_service
内部实现具有处理程序的线程安全队列,这使得它比我自己的初始简单线程安全队列设计更有效率)。请注意,我的设计经过了充分的审查,没有出现任何错误(骨架代码基于已证明的示例),是否有人可以更详细地了解io_service
如何实现此目的的内部细节。第二个有趣的观察是,在增加线程时,我的初始实现性能得到了改善,但是以丢失序列化/排序为代价,但性能随boost :: asio降低(非常轻微)(我认为这是因为我的处理程序做了非常简单的任务,并且上下文切换开销正在下降,我会尝试执行更复杂的任务并在稍后发布我的观察结果)。我真的很想知道
boost::asio
只是用于I/O和网络操作,还是我用它来通过线程池执行并行任务(并行)是一种很好的设计方法。io_service
对象只是用于I/O对象(如文档中所写),但我发现它是一种非常有趣的方式,可以帮助我以序列化的方式解决并发任务(不仅仅是I/O或与网络相关的任务)使用股线进行排序)。我很兴奋,并且很好奇为什么基本模型没有执行/缩放以及当我使用boost asio。
结果:(在我刚1个工作线程)
- 1000任务:在这两种情况下 10微秒/任务
- 10000任务:80微秒(有界缓冲液),在升压10微秒ASIO
- 100000任务:250微秒(bounde缓冲液),在升压10微秒ASIO
这将是有趣到k现在如何提升解决线程安全问题io_service
处理程序的线程安全队列(我总是认为在某种程度上的实现,他们也必须使用锁和c.v)。
我已经使用'boost :: asio'来管理其他类型的异步任务(不仅仅是网络IO)以取得良好的成功。 – Chad 2012-03-20 15:13:00
我知道这是一个老问题,但可能(在Windows上),ASIO使用IO完成端口,这可能会导致总体系统调用较少。 – Pete 2013-10-22 08:21:09