架构师训练营第七周学习总结
这周的内容包括系统性能的测试与优化和操作系统。
关于系统性能,首先要考虑主观视角和客观视角。主观视角关注用户感受,客观视角关注性能指标。有些时候可以通过管理用户的感受来实现优化。
常见的性能指标有:响应时间、并发数、吞吐量、性能计数器等。
性能测试:测试系统是否达到性能预期
负载测试:寻找性能下降的临界值
压力测试:寻找系统崩溃的临界值
稳定性测试:测试一段时间的稳定性
在了解了性能指标以及测试方法后,下一个要考虑的就是如何优化系统了。
性能优化的两个原则:
你不能优化一个没有测试的软件
你不能优化一个你不了解的软件
分层优化:
这里面的内容就和之前讲授的内容相联系了。
说到性能优化,我在第一次进入社会在公司实习的时候一开始就接到了一个有关性能优化的任务。那是一家手游公司,要优化的内容自然也是手游。“我们这个游戏玩起来有时候比较卡,具体来说就是帧数不到60,你看看怎么能解决这个问题,最后我只要结果”,技术负责人如是说。
这款游戏使用的是Cocos-2dx引擎,底层C++,上层逻辑是lua。看了几天代码大致对各个部分有了些了解,于是开始着手优化。之前在高性能计算里学到的优化原则是,将所有的精力用来优化复杂度最高的部分,其他复杂度低的部分再优化对时间的影响也不会太大。接着使用了Xcode的Instruments工具,得到了每条语句的运行次数以及消耗时间,沿着这个线索找下去,最终锁定了引擎中的一个函数。这个函数调用的次数很多,有几条语句十分耗时。我将这个函数由原来的C++语法改写为C,实现的时候也注意了效率,改过之后果然游戏运行的帧率提高了不少,印象中是从一秒不到十帧提高到了二十多帧。如果回到课程内容的话,既然是修改的引擎,姑且可以算作基础组件的优化吧。
之后的课程讲述了一些关于操作系统的内容。
老师提到:程序是死的,运行之后进程是活的。
之后讲述了一些CPU调度与进程、进程与线程的内容。
说到线程,自然会提到线程安全,自然也会提到锁与临界区。
锁原语 CAS (Compare-and-swap)
锁原语是实现锁的基础,锁原语通过硬件保证执行不会中断。
在JAVA中,同步代码会涉及到下面几种锁:
在多CPU情况下可以使用总线锁和缓存锁。
通过对锁的性质划分:
公平锁(轻量级锁,无法预知CPU调度顺序)、非公平锁(重量级锁,使用队列保证先进先出)
可重入锁
互斥锁、共享锁、读写锁
乐观锁(缓存锁)、悲观锁(总线锁)
从锁的应用角度还有分段锁与自旋锁。
之后介绍了有关文件系统的内容。
根据不同的应用需求选择不同的硬件:
机械硬盘擅长连续访问适合使用LSM树
固态硬盘擅长随机访问适合使用B+树
Linux inode (index node)
HDFS
版权声明: 本文为 InfoQ 作者【whiter】的原创文章。
原文链接:【http://xie.infoq.cn/article/94f196e5127d620dafc9373cf】。未经作者许可,禁止转载。
评论