搜索
bottom↓
回复: 7

今天仔细测试了一下Windows线程同步,发现锁的效率真TMD低

[复制链接]

出0入442汤圆

发表于 2013-5-28 21:20:34 | 显示全部楼层 |阅读模式
RT,今天写了个小内存池,但是让我头疼的是,无论如何优化,性能居然连new delete都比不过
换了N种写法,还是不成,最后怒了,去掉锁,速度一下子提升了20倍。曰,Windows的线程锁也太慢了吧。
没办法,只能修改算法了。新算法理论推导基本完成,就是用线程+队列+推送方式设计,推送队列尽可能的长,要不然唤醒推送线程又得花不少时间。这样子,取消了锁,估计性能会更上台阶吧。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

发表于 2013-5-28 21:28:44 | 显示全部楼层
Win下可以用GetPerformanceCounter Log一下事件的绝对顺序,看看是哪里的问题。
如果非常频繁的获得锁,休眠一下任务的开销还是很大的。

出0入442汤圆

 楼主| 发表于 2013-5-29 08:38:06 | 显示全部楼层
dr2001 发表于 2013-5-28 21:28
Win下可以用GetPerformanceCounter Log一下事件的绝对顺序,看看是哪里的问题。
如果非常频繁的获得锁,休 ...

呵呵,就一个线程,而数据结构设计需要频繁获取锁。所以下一步就改进设计理论基础,用队列和推送来实现高效率无锁结构。木办法,要么简单但慢,要么快但复杂。

出0入0汤圆

发表于 2013-5-29 08:51:36 | 显示全部楼层
dr2001 发表于 2013-5-28 21:28
Win下可以用GetPerformanceCounter Log一下事件的绝对顺序,看看是哪里的问题。
如果非常频繁的获得锁,休 ...

这个performenceCounter ,linux下有没有对应的替代啊? 3ks

出0入0汤圆

发表于 2013-5-29 08:53:42 | 显示全部楼层
titer1 发表于 2013-5-29 08:51
这个performenceCounter ,linux下有没有对应的替代啊? 3ks

clock_gettime
具体用法Google就行了。

RDTSC用起来过于复杂,不建议使用。

出350入477汤圆

发表于 2013-5-29 09:26:18 | 显示全部楼层
本帖最后由 redroof 于 2013-5-29 09:29 编辑
dr2001 发表于 2013-5-29 08:53
clock_gettime
具体用法Google就行了。


rdtsc最好用了。。。

//该函数可能要加上某些编译器指令来告诉编译器它“没有”返回值(实际rdtsc指令直接把返回值放到了64位返回寄存器(EDX:EAX)里面)

__int64 rdtsc()
{
        __asm rdtsc;
}

class CpuTimer
{
public:
        __int64 TimerData;

        void Start()
        {
                TimerData = rdtsc();
        }

        void Stop()
        {
                TimerData = rdtsc() - TimerData;
        //得到的TimerData是按CPU时钟数来计算的,对个人调试足够了(你当然知道你自己的CPU主频)
        //如果要得到绝对时间,得按照CPU主频来换算,Windows可读注册表得到CPU主频,Linux好像可以从CPU信息中得到
        }

}

出0入0汤圆

发表于 2013-5-29 09:43:25 | 显示全部楼层
本帖最后由 dr2001 于 2013-5-29 09:45 编辑
redroof 发表于 2013-5-29 09:26
rdtsc最好用了。。。

//该函数可能要加上某些编译器指令来告诉编译器它“没有”返回值(实际rdtsc指令直 ...


1、RDTSC是每个核独立的计数器,只要线程没有始终绑定到唯一确定的核上,结果就肯定是错的,这时候计数都不一定单调增。
2、RDTSC的计数频率是可能变化也可能不变的,不同代的处理器完全不一样。只要Turbo Boost,自动降频等功能开启,RDTSC出来的结果的可信性就有相当的风险。

如果代码严格注意了以上的情况,并且首先在在特定的系统+硬件平台进行测试确认,RDTSC还是很准确的。不过这样的代码要是想通用,且能覆盖实际运行工况,一点戏没有。

现在搞精确一些的时间测量,用HPET,Performance Counter的多一些;一般来说粒度够用了。RDTSC只能在经过验证的受控环境下使用,拿来直接用的RDTSC,跟随机数没太多差异。

出0入0汤圆

发表于 2013-5-29 12:13:04 | 显示全部楼层
dr2001 发表于 2013-5-29 08:53
clock_gettime
具体用法Google就行了。


谢谢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 02:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表