《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记

来源:互联网 发布:网络连接错误651win7 编辑:程序博客网 时间:2024/05/04 09:12
造成开销的操作包括:
1. 线程之间的协调(例如:锁、触发信号以及内存同步等)
2. 增加的上下文切换
3. 线程的创建和销毁
4. 线程的调度

一、对性能的思考

1 性能与可伸缩性
运行速度涉及以下两个指标:
某个指定的任务单元需要“多快”才能处理完成、计算资源一定的情况下,能完成“多少”工作。

可伸缩性:
当增加计算资源时(例如:CPU、内存、存储容器或I/O带宽),程序的吞吐量或者处理能力能相应地增加。

2 评估各种性能权衡因素
避免不成熟的优化。首先使程序正确,然后再提高运行速度---如果它还运行得不够快。
以测试为基准,不要猜测。
提出问题:例如“更快”的含义是什么?提升多少效率?


二、并发三大定律

Amdahl 定律
Gene Amdahl 发现在计算机体系架构设计过程中,某个部件的优化对整个架构的优化和改善是有上限的。这个发现后来成为知名的 Amdahl 定律。
(即使你有10个老婆,也不能一个月把孩子生下来。)

Gustafson 定律
Gustafson假设随着处理器个数的增加,并行与串行的计算总量也是可以增加的。Gustafson定律认为加速系数几乎跟处理器个数成正比,如果现实情况符合Gustafson定律的假设前提的话,那么软件的性能将可以随着处理个数的增加而增加。
(当你有10个老婆,就会要生更多的孩子。)

Sun-Ni 定律
充分利用存储空间等计算资源,尽量增大问题规模以产生更好/更精确的解。
(你要设法让每个老婆都在干活,别让她们闲着。 )


1 示例:在各种框架中隐藏的串行部分
2 Amdahl定律的应用

多线程中串行部分是性能提升的瓶颈,例如:
多线程在同一个队列中取出任务,因为需要保证线程安全肯定在队列上加锁,此时就是多线程中串行部分。
多线程通常是处理一些计算,而计算结果可能需要多个线程间进行共享,这也是多线程中串行部分。

三、线程引入的开销

1 上下文切换
大多数通用的处理器中,上下文切换的开销相当于5000~10000个时钟周期(几微妙)
UNIX系统的vmstat、mpstat命令和Windows系统的perfmon工具都能报告上下文切换次数以及和内核中执行时间所占比例等信息。

yw.cnhan.com/yyk/kmnkyy/5777564237.html
yw.cnhan.com/yyk/kmnkyy/5777569380.html
yw.cnhan.com/yyk/kmnkyy/5777573342.html
yw.cnhan.com/yyk/kmnkyy/5777576322.html
yw.cnhan.com/yyk/kmnkyy/5777579614.html
yw.cnhan.com/yyk/kmnkyy/5777586037.html
yw.cnhan.com/yyk/kmnkyy/5777590875.html
yw.cnhan.com/yyk/kmnkyy/5777593307.html
yw.cnhan.com/yyk/kmnkyy/5777597686.html
yw.cnhan.com/yyk/kmnkyy/5777600060.html
yw.cnhan.com/yyk/kmnkyy/5777689963.html
yw.cnhan.com/yyk/kmnkyy/5777693998.html
yw.cnhan.com/yyk/kmnkyy/5777697412.html
yw.cnhan.com/yyk/kmnkyy/5777700169.html
yw.cnhan.com/yyk/kmnkyy/5777703395.html
yw.cnhan.com/yyk/kmnkyy/5777707191.html
yw.cnhan.com/yyk/kmnkyy/5777710193.html
yw.cnhan.com/yyk/kmnkyy/5777712013.html
yw.cnhan.com/yyk/kmnkyy/5777715076.html
yw.cnhan.com/yyk/kmnkyy/5777717346.html


0 0