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

原创 2012年03月27日 16:41:36

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


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

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


二  使用正确数目的互斥量

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


三  太多互斥量不会有帮助

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

四  绝不要与缓存作对

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

线程同步:解决线程不安全问题

当多个线程并发访问同一个资源对象时,可能会出现线程不安全的问题,比如现有50个苹果,现在有请三个童鞋(小A,小B,小C)上台表演吃苹果.因为A,B,C三个人可以同时吃苹果,此时使用多线程技术来实现这个...
  • caidie_huang
  • caidie_huang
  • 2016年10月07日 12:30
  • 1447

Android应用开发性能优化完全分析

1 背景 其实有点不想写这篇文章的,但是又想写,有些矛盾。不想写的原因是随便上网一搜一堆关于性能的建议,感觉大家你一总结、我一总结的都说到了很多优化注意事项,但是看过这些文章后大多数存在一个问题就是...
  • DreamChanDev
  • DreamChanDev
  • 2016年07月19日 22:39
  • 1728

在Java中如何避免死锁?

你可以通过打破互相等待的局面来避免死锁。为了达到这一点,你需要在代码中合理地安排获取和释放锁的顺序。如果获得锁的顺序是固定的,并且获得的顺序和释放的顺序刚好相反的话,就不会产生出现死锁的条件了。...
  • syc434432458
  • syc434432458
  • 2016年02月16日 14:22
  • 3247

设计高性能的应用程序 1/3 (Windows, 多线程 + IOCP)

Designing Applications for High PerformanceRick Vicik - Architect, Windows Server Performance Team原文...
  • pthiiu
  • pthiiu
  • 2011年05月24日 07:48
  • 554

Android进阶——性能优化之多线程总结及简单应用(一)

进程是一个正在执行中的程序,线程在控制着进程的执行。线程属于某个进程,进程中的多个线程共享进程的内存。CPU真正执行的是线程,在某一时刻永远只有一个线程在执行(多核除外),cpu总是在极短的时间内不停...
  • CrazyMo_
  • CrazyMo_
  • 2016年12月12日 00:37
  • 1191

Unity3D的Delegate和SendMessage的性能差测试,以及Delegate在多线程使用要注意的小问题

一、回顾前面写的关于Delegate的消息传送优化文章,http://blog.csdn.net/chiuan/article/details/7883449  下面的代码是做一个简单的Delega...
  • chiuan
  • chiuan
  • 2012年08月29日 10:34
  • 17148

Java多线程引发的性能问题以及调优策略

本文主要介绍了Java多线程引发的性能问题以及调优策略,包括对线程同步、线程池、以及伪共享所引发的问题,并提出了相应的解决方法......
  • luofenghan
  • luofenghan
  • 2017年11月21日 21:06
  • 701

多线程性能及效率问题

一、[多线程概要]   随着计算机技术的发展,编程模型也越来越复杂多样化。但多线程编程模型是目前计算机系统架构的最终模型。随着CPU主频的不断攀升,X86架构的硬件已经成为瓶,在这种架构的CPU主频...
  • stonesing
  • stonesing
  • 2015年11月09日 22:52
  • 7699

Python的多线程性能问题和并发问题

原文标题:一行 Python 实现并行化 -- 日常多线程操作的新思路 原文地址:http://www.zhangzhibo.net/2014/02/01/parallelism-in-one-li...
  • ztb3214
  • ztb3214
  • 2015年08月21日 16:37
  • 1159

多线程 DLL 回调函数问题,当应用程序退出时,有些操作并未完成,造成程序内存泄露,如何解决呢

问题描述如下:  现在有一个DLL库,里面定义了一个线程,线程里面又调用了应用程序中定义的回调函数,这样当应用程序退出时,应用程序中的回调函数还没有执行完毕,停在中间了,造成程序内存泄露,Debug内...
  • smilestone322
  • smilestone322
  • 2011年06月18日 23:41
  • 2101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程应用中如何避免性能问题
举报原因:
原因补充:

(最多只允许输入30个字)