多线程应用中如何避免性能问题

多线程应用中避免性能问题的四个方面:


一  了解并发串行化:
理想的并发代码是一组完全I/O密集型任务。它们从不同步,很少计算---它们仅仅执行IO请求并等待。也就是多个不用进行同步的任务写成多线程方式进行处理的时候效率性能最高。

若你在写一组计算密集型或IO密集型并行线程时遇到了上述问题,并显示你只是将串行程序改为一个多线程的串行程序,结果会是一个更慢的程序,它使用更多的开销来完成相同的结果。
要点是写一个使用线程的程序并不能保证并行甚至并发。当你分析性能时,要了解你的程序可能受你无法控制的因素影响。你可能甚至无法看到文件系统中发生的事,但是无法看到的事情就可够伤害你。


二  使用正确数目的互斥量

使函数库成为线程安全的第一步可能是创建一个“大互斥量”来保护函数库的所有入口。若库没有包含需要在多个调用间保持一致的永久状态,“大互斥量”好像是足够了,很多函数就是这种状态。若使用那个函数库是线程的主要功能,则使用单个线程将使程序跑得更快。如:Xlib中的大互斥量将阻止所有其他线程使用任何Xlib函数直到第一个线程从服务器收到应答,这可能会花费相当一段时间。
规划函数库功能,决定哪个操作可以合理地并行执行。通常的策略是为每个数据结构创建一个独立的互斥量,并且使用那些互斥量来串行化对共享数据的访问,而非使用“大互斥量”来串行化对函数库的访问。


三  太多互斥量不会有帮助

同样需要注意的是,用很多“小”互斥量交换一个“大”互斥量,你可能适得其反。加锁互斥量要花时间,解开互斥量需要更多时间。在互斥量加锁解锁上花费太多时间,而并没有做多少真正的工作。
加锁互斥量也影响内存子系统。除了加锁和开锁的时间开销,你可能因为额外的加锁操作而降低内存系统的效率。如:锁住一个互斥量可能使所有处理器上的一块缓存无效。它可能停止某段物理地址范围上的所有总线活动。
因此要找出在哪儿你确实需要互斥量。如:在前面讲到为每个数据结构创建一个独立的互斥量。然而,如果两个数据结构通常被一起使用,或者若当其他线程正使用第二个数据结构时,线程将很少需要使用第一个数据结构,则额外的互斥量可能降低程序的整体性能。

四  绝不要与缓存作对

现代计算机不会直接从主存读取数据。能够与计算机一样快的内存过于昂贵,使得(直接从主存读数据)不实际。相反,数据被内存管理单位取到一个很快的本地缓存数组中。当计算机写数据时,也是写到本地的缓存数组中。修改的数据可能很快地被写回主存,或者仅当需要时才被“刷新”回主存。因此,如果在一个多处理机系统中,一个处理器需要读取其他处理器缓存区中的值时,必须有一些“缓存一致性”机制确保它能够发现正确的数据。更重要地,当一个处理器向某个位置写数据时,在缓存中拥有旧拷贝的所有其他处理器需要拷贝新数据,或记录旧数据无效。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值