- 论坛徽章:
- 9
|
本帖最后由 wlmqgzm 于 2015-11-02 11:28 编辑
回复 95# hellioncu
谢谢提醒, 昨天在 服务器代码中又仔细找了一遍可能需要 内存屏障 的地方, 基本上所有的代码都不需要, 因为这些需要线程交换数据的地方, 都调用了io_sevice.post, post内部设置了 内存屏障
只有1个显示统计总计数的函数, 可能会需要.
最终调用这个显示统计总计数函数的地方只有一处, 就是最后退出, 总体析构的时候, 而且析构过程中有至少有1ms sleep保护,最后才调用显示统计总计数, 理论上也不需要 内存屏障
但是考虑以后, 可能要更改代码, 提供随时查看总计数, 在更新计数器的函数中就加上了 sfence.
boost::asio::detail::fenced_block fb( boost::asio::detail::fenced_block::half );
继续进行底层的基本性能测试, 算学习吧, 更精细的了解情况.
测试对比性能, 只使用sfence的代码, 每秒大约可执行6亿次, 比不冲突的锁, 性能要高10倍. 减少锁的使用量, 确实能够提高一点性能.
但是, 非冲突的锁, 单线程下每秒也可以执行6000多万次, 性能也是非常突出的.
所以, 有锁的前提下, 最重要的是减少锁冲突, 代码中有几个锁,如果不冲突的话, 代价并不高.
begin test half fenced_block(sfence)
0.163584s wall, 0.160000s user + 0.000000s system = 0.160000s CPU (97.8%)
100000000
begin test fenced_block(sfence+lfence)
0.410092s wall, 0.400000s user + 0.000000s system = 0.400000s CPU (97.5%)
100000000
begin test mutex.
100000000
1.503490s wall, 1.500000s user + 0.000000s system = 1.500000s CPU (99.8%)
begin test atomic.
0.509658s wall, 0.500000s user + 0.000000s system = 0.500000s CPU (98.1%)
100000000
- void test_fenced_block( void )
- {
- unsigned int i;
- unsigned int j=0;
- std::cout << "begin test fenced_block"<< std::endl;
- {
- boost::timer::auto_cpu_timer a2;
- for( i=0; i<100000000; ++i ) {
- boost::asio::detail::fenced_block fb( boost::asio::detail::fenced_block::full );
- ++j;
- continue;
- }
- }
- std::cout << j << std::endl;
- return;
- }
- void test_half_fenced_block( void )
- {
- unsigned int i;
- unsigned int j=0;
- std::cout << "begin test half fenced_block"<< std::endl;
- {
- boost::timer::auto_cpu_timer a2;
- for( i=0; i<100000000; ++i ) {
- boost::asio::detail::fenced_block fb( boost::asio::detail::fenced_block::half );
- ++j;
- continue;
- }
- }
- std::cout << j << std::endl;
- return;
- }
复制代码 |
|