再谈 高性能无锁(Lock-free) 内存池
2010-08-12 14:08
603 查看
阅读前先看看:高性能无锁(Lock-free) 内存池
好吧,我承认当初加上 高性能 3个字只是用来吸引眼球的。这几天我一直在测试这个内存池和无锁堆,内存池的效率确实比 new 高得多,遗憾的是,我测试了使用锁 + std::stack 的方式,和无锁堆+无锁内存池的组合,我的测试是在循环里不断push和pop,会产生大量线程冲突。
开始时开了4线程密集测试,我很惊讶的发现,无锁组合比锁慢2~3倍!
使用 VS 2010 的性能分析功能分析后发现,大量的时间被消耗在 cas 操作上了。因此无锁算法并不一定就比锁快,是有条件的。
在我的双核机器上测试的结果,单个线程时无锁版本快50%左右,而从双线程开始,在线程数较低时,锁一直比较快,而线程数超过 16 左右后,情况开始反转,无锁版本慢慢占了上风。
然后,我企图测试低冲突下的性能,在循环里放入了 Sleep(0), 从双线程开始,双方的用时基本一致,然后无锁版本慢慢开始占优。但是到32线程为止,只有20% 左右的提高。
因此,在线程数不高的情况下,锁的效率其实并没有想象中那么低,由于锁的使用可以降低业务业务逻辑(像 std::stack 里使用的连续内存模型,应该就比我的队列内存池模型来的有效率,不过这只是猜想),还应该是 并行计算 里的主流。而在线程数较高的情况下,你就应该考虑无锁算法了!
PS: 无锁算法的另一个好处——不会死锁,应该会大大提高程序的稳定性。
好吧,我承认当初加上 高性能 3个字只是用来吸引眼球的。这几天我一直在测试这个内存池和无锁堆,内存池的效率确实比 new 高得多,遗憾的是,我测试了使用锁 + std::stack 的方式,和无锁堆+无锁内存池的组合,我的测试是在循环里不断push和pop,会产生大量线程冲突。
开始时开了4线程密集测试,我很惊讶的发现,无锁组合比锁慢2~3倍!
使用 VS 2010 的性能分析功能分析后发现,大量的时间被消耗在 cas 操作上了。因此无锁算法并不一定就比锁快,是有条件的。
在我的双核机器上测试的结果,单个线程时无锁版本快50%左右,而从双线程开始,在线程数较低时,锁一直比较快,而线程数超过 16 左右后,情况开始反转,无锁版本慢慢占了上风。
然后,我企图测试低冲突下的性能,在循环里放入了 Sleep(0), 从双线程开始,双方的用时基本一致,然后无锁版本慢慢开始占优。但是到32线程为止,只有20% 左右的提高。
因此,在线程数不高的情况下,锁的效率其实并没有想象中那么低,由于锁的使用可以降低业务业务逻辑(像 std::stack 里使用的连续内存模型,应该就比我的队列内存池模型来的有效率,不过这只是猜想),还应该是 并行计算 里的主流。而在线程数较高的情况下,你就应该考虑无锁算法了!
PS: 无锁算法的另一个好处——不会死锁,应该会大大提高程序的稳定性。
相关文章推荐
- 高性能无锁(Lock-free) 内存池
- 高性能无锁(Lock-free) 内存池
- DIOCP开源项目-Delphi高性能无锁队列(lock-free)
- DIOCP开源项目-Delphi高性能无锁队列(lock-free)
- boost::lockfree::queue记录
- 无锁队列 lock free queue
- Lock-free 多核数据结构设计
- MPSC lock free queue
- LockFreeHashMap:无阻塞代码技巧
- 无锁数据结构(Lock-Free Data Structures)
- linux 下实现高性能读写锁(read/write lock)
- Lock-free 多核数据结构设计
- MemoryPool的LockFree实现
- 无锁编程:lock-free原理;CAS;ABA问题
- lock free数据结构内存回收技术-hazard pointer
- lock free queues
- Lock,LockFree,MemoryBarrier,ConcurrentCollection
- Lock-Free Code: A False Sense of Security
- 锁无关的(Lock-Free)数据结构——在避免死锁的同时确保线程继续
- lock-free算法入门