关键词:软件优化,软件加速,软件响应时间,提高软件速度
环境:linux
软件优化
软件启动速度
前台后台
当软件执行文件越来越大,如果启动时一次性加载整个执行文件,那么软件的启动速度会很慢。我们可以把软件分成前台和后台部分(服务或者deamon程序),在软件启动前,后台部分已经常驻内存,这样软件启动时,加载的代码和数据可以明显减少,软件启动的速度就提高了。
So动态库
软件一般都要依赖很多第三方库文件,当软件启动时,加载器需要在依赖路径里面查找这些动态库,并加载这些动态库,并解析动态库里面函数符号。当软件依赖的动态库很多的时候,这是一个非常耗时的过程。我们可以通过把有些动态库转成静态库,或者把2个相关动态库合并成一个动态库。
Release版本
软件debug版本里面有一些信息打印,和很多调试相关的信息,这些都会影响软件启动速度。软件release版本编译器会有很多优化,可以提高软件启动速度。
软件运行速度
算法和计算量
算法重要性这里不再说明。这里举例硬件性能提高10倍后,软件计算能力能提高多少。
如果算法复杂度是O(n), 那么 n2 / n1 = 10, n2 =10 * n1, 算法快了10倍。
如果算法复杂度是O(n^2), 那么 n2^2 = 10 * n1^2,n2 = 10^(1/2) n1, 算法快了3.16倍。
如果算法复杂度是O(2^n),那么 n2 = n1 + 3, 算法比原来多算3个数。 当算法复杂度是指数级,硬件性能提高10倍,对软件性能影响不大(只多算3个)。
硬件加速
软件大多有GUI界面,如果可以发挥显卡GPU的作用,可以很大提高软件运行速度。这是硬件加速的很好例子。CPU现在也增加了硬件加速的设计,需要我们进一步发挥硬件加速能力。
缓存
缓存可以显著提高软件运行速度。例如浏览器的网页缓存,打开硬盘文件的文件缓存,显卡的图形缓存。
预处理
例如Chrome预处理功能(加快Chrome域名解析),与其在打开页面时等待DNS解析域名,不如让Chrome在用户浏览网页的过程中,主动进行域名解析。比起传统的浏览器,这项功能使Chrome首次访问一个域名时,平均节省250ms的加载时间。
Chrome 的预渲染相对于只下载一个资源的“prefetch”, “prerender”会让 Chrome 在一个不可见的页签中渲染一个页面,包含了它所有的子资源。当用户要浏览它时,这个页签被切到前台,做到了即时的体验。
大内存
现在64位系统支持几百G的内存,内存访问速度远大于硬盘,所以软件可以多使用内存加快软件处理速度。例如Red Had Enterprise Linux (RHEL)6.4的64位版本。
多线程
把软件IO部分作为一个线程,计算部分作为一个线程,GUI部分作为一个线程。提炼出可并行的处理,并改为线程。
超多小文件
例如磁盘碎片会使系统的总体性能变慢。当文件分成许多碎片时,计算机在打开文件时必须搜索硬盘(以将其重新拼凑在一起)。这会显著减慢软件运行速度。
当我们在windows上拷贝文件夹时,如果文件夹里面有超多小文件(例如大项目的源代码),拷贝速度是非常非常慢:(
软件切换速度
UI设计
先显示部分,然后逐步显示。
WaitToKillAppTimeout
当程序失去响应的时候,可以快速关闭程序。软件实现过程中,某些IO操作需要设置等待时限,通过定时器结束等待时间过长的IO操作。
参考资料:
Chrome高性能的秘密:预连接、预加载与预渲染
《软件优化技术》