您的位置:首页 > 其它

再谈 高性能无锁(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: 无锁算法的另一个好处——不会死锁,应该会大大提高程序的稳定性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: