Intel平台编程,可以采取自顶向下的软件优化策略。
影响软件性能的因素除了所采用的算法的性能外,还包括处理器、内存、网络接口、磁盘I/O接口等硬件设施以及运行的操作系统、平台软件和程序库等。因此在进行软件的性能优化时,一般采取自顶向下的方法:首先是系统层的优化,其主要目的是确保那些包括处理、内存、网络和磁盘接口等在内的系统级的部件不会成为应用的瓶颈;接下来,是应用层的优化,主要从整个应用的层面进行优化,比如选择更加合适的API接口,采用多线程技术以及锁的优化等;最后是微结构层的优化,主要是针对缓存访问缺失、分支预测以及采用处理器相关的特性等。
1 系统层的优化
系统层的性能瓶颈可以通过检测应用运行过程中的CPU、内存、网络和磁盘的利用情况来找到。相对来说,系统层的性能平台的定位最为容易。在找到性能瓶颈后,可以针对这些硬件部分、操作系统和平台软件进行硬件的升级或者软件的更新与配置。一般来说,工作站级的应用由于一般运行在单台机器上面,而且一般处于用户模式,系统层的性能瓶颈问题相对来说要少一些,但是对于服务器级的应用,由于相对比较复杂,经常要使用大量的资源,因此,这些应用的优化的第一步应该侧重于系统级的优化。
怎样知道系统层的硬件和操作出现了性能瓶颈了呢?这个可以通过一些性能检测工具来观察,比如,windows操心系统的任务管理器。可以通过任务管理器查看CPU和内存使用情况,计算机上运行的句柄、线程和进程的总数以及物理、核心和认可的内存使用情况,还可以通过任务管理器查看网络带宽的变化情况。windows操作系统还提供了一个性能监视器perfmon来对操心系统资源进行详细的监视,另外,Intel的VTune性能分析器也可以通过计数器监控功能来进行检测,这些计数器主要分为CPU、内存、磁盘和网络的四大类。CPU类的计数器主要包括:
(1)%Processor Time以及%Total Processor Time给出了某个处理器或者所有处理器忙的时间的比例,它是描述处理器的活动情况的主要参数。
(2)%Privileged Time给出了处理器运行在特权模式的比率,一般在调用windows服务是,由于要访问系统专有的数据,常常处于特权模式。
(3)%Interrupt Time给出了处理器处理的中断和执行中断处理占用的时间的比率,从而可以检测那些产生中断的设备的活动情况,这些设备包括系统时钟,鼠标,磁盘,网卡等。
VTune提供的可以用于系统级优化过程的和内存有关的计数器包括:
(1)Available Bytes给出了目前还剩余的虚拟内存的大小。
(2)Cache Bytes给出了当前系统使用的缓存空间的大小。
(3)Cache Bytes Peak给出了系统启动后最大使用的缓存空间的大小。
(4)Pages/sec给出了页故障的读写的页数。
(5)Copy Read Hits给出了药访问的数据在缓存中的比率。
和磁盘读写相关的计数器包括:
(1)Disk transfer/sec给出了每秒钟磁盘读写操作的次数。
(2)Average Disk sec/Transfer 给出了磁盘传输操作所需要的平均时间。
(3)Current Disk Queue length给出了当前磁盘访问队列中的请求个数,一般如果长度大于2则可能是磁盘的性能问题。
和网络相关的计数器包括:
(1)Bytes Total/sec给出了每秒钟传输的字节数。
(2)Packets Outbound/Received Errors分别给出了由于错误而无法发送出或者接收后无法递交到更高层次的分组个数。

2 应用层的优化
应用层的优化主要是为了更加有效地访问资源,包括线程、锁的优化以及选择更好的API接口,一般可能会要求修改应用的语义,包括对应用的某些部分进行重新设计或者重新实现,比如原来的多进程或者单进程改为多线程的实现等。
应用层的性能优化可以通过VTune的性能计数器检测以及采样机制来找到那些经常运行的线程、模块和函数,再针对这些部件进行优化。需要检查的计数器除了前面介绍过的Totla Processor Time和Total Privileged Time外,还包括下列计数器:
(1)Context Switch/sec给出了线程切换CPU的次数,如果一个应用有很多线程要访问同一个资源时,由于资源的限制,经常要进行线程的切换,因此,一般会具有一个比较高的取值。
(2)User Time给出了该应用进程运行在用户模式的时间所占的比率。
(3)Thread Count给出了该应用进程目前活跃的线程个数。
3 微结构层的优化
微结构层的优化主要理由微处理器的特性,包括分支预测、数据对齐、循环和缓存的优化等。VTune性能分析器可以通过基于时间的采样来寻找可能优化的瓶颈。比如分支预测可以通过Branch Events组中的相关事件来检测,数据对齐可以通过Misaligned References Ratio来监测,缓存优化可以通过监测有关L1缓存和L2缓存的事件来判断。

4 优化规则80/20原则
软件优化的一个很重要的原则就是不要试图对代码的每个部分进行优化,而应该只对那些“热点”进行优化,如果花费大量的时间来优化应用的“冷点”部分,则这些开销可能对于整体的性能提升并不是非常大。简单来说,就是始终优化开销最高的前5-10个函数。对于那些没有热点的应用,软件的优化可以进一步在内存的布局、更好的编译选项方面进行优化。

10-02 22:20