CSAPP 5 - 优化程序性能

1. 概述

  1. 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构
  2. 其次才是编写出能让编译器 易优化的,高效的可执行代码。这点在特定的机器上可能有着特定的不同的优化,但有一些基本的优化仍然是相同的。
    1. 消除不必要的工作,让代码消耗时间在期望执行的任务上。包括消除或减少函数调用、条件测试、内存引用;同时熟悉处理器如何工作,利用反汇编知道它究竟如何执行操作,从而调整程序获得最大的速度。
    2. 利用好处理器的指令级并行能力,同时执行多条指令

2. 利用好编译器自身优化

gcc 就提供了不同优化级别的执行操作,利用 -O1 -O2 -O3 对程序进行不同级别的编译器优化代码。gcc 也在不断的更新迭代,编译器自身也在越来越强大。

基本编码规范:(避免限制优化的因素,产生更高效的代码)

消除连续的函数调用;避免不必要的内存引用

3. 消除循环的低效率,内存调用等

  • 展开循环,降低开销
  • 实现指令级并行
  • 用功能性代码重写条件操作,使得编译采用条件传送
for (i=0; i<len; i++)
if (s[i] >= 'A' && s[i]<= 'Z')
s[i] -= ('A' - 'a');

函数调用不断使用,极其低效

4. 理解现代处理器

现代处理器采用分支预测的技术,处理器会猜测是否会选择分支,同时还预测分支的目标地址。这就让true/false 很痛苦,因为一旦预测失败就会产生很大的代价。所以我们会尽可能的采用条件传送(conditional move),而不是条件控制转移。

条件控制转移:等待代码的条件结果,选择合适的路径

for (i=0;i<n;i++)
if(a[i]>b[i]){
long t = a[i];
a[i] = b[i];
b[i]=t;
}

条件传送:先将结果运行,再根据结果选择最终的结果值

for (i=0;i<n;i++)
if(a[i]>b[i]){
long min =a[i] < b[i] ? a[i] : b[i];
long max =a[i] < b[i] ? b[i] : a[i];
a[i] = min;
b[i] = max;
}

防止寄存器溢出

当并行度 p 超过可用寄存器的数量,编译器就会溢出,将一些临时变量放在内存中,会降低运行速度

5. 利用代码剖析程序,进行分析

Unix提供剖析程序GPROF可以进行代码剖析分析

代码剖析(Code profiling)
程序员在优化软件性能时要注意应尽量优化软件中被频繁调用的部分,这样才能对程序进行有效优化。使用真实的数据,精确的分析应用程序在时间上的花费的行为就成为_代码剖析_。现在几乎所有的开发平台都支持代码剖析,本文要介绍的是linux下针对c/c++的GNU的gprof代码剖析工具。 PS:gprof不只能对c/c++,还可对Pascal和Fortran 77进行代码剖析。 gprof
GNU gprof 是一款linux平台上的程序分析软件(unix也有prof)。借助gprof可以获得C/C++程序运行期间的统计数据,例如每个函数耗费的时间,函数被调用的次数以及各个函数相互之间的调用关系。gprof可以帮助我们找到程序运行的瓶颈,对占据大量CPU时间的函数进行调优。 PS:gprof统计的只是用户态CPU的占用时间,不包括内核态的CPU时间。gprof对I/O瓶颈无能为力,耗时甚久的I/O操作很可能只占据极少的CPU时间。 如何使用gprof
gprof的使用很简单,遵循以下步骤即可: 参考文档: https://sourceware.org/binutils/docs/gprof/index.html#Top

6. 小结

没有一个编译器能用好的算法代替低效率的算法,因此程序设计的内容才是仍然是程序员主要关心的。我们应当养成良好的代码风格,给后续的工作带来便捷。

CSAPP 5 - 优化程序性能的更多相关文章

  1. 优化程序性能(CSAPP)

    [前言]虽然现在没有接触过大型项目,但是工作了会注重性能.学习一下,应该能更好更快的理解别人写的经典优化的代码.结合CSAPP和自己的理解,总结一下. 一.程序优化综述 1.高效程序的特点 (1)适当 ...

  2. C# ASP.NET 优化程序性能、降低内存使用、提高程序运行速度

    首先纪念一下今天的股票大跌抓个图,虽然我自己损失不是很大,但是应该大多人都损失不小.也可能有人会继续跳楼,也可能是股市一个新的转折点来了. 接着还是重点关注自己写代码优化的主题吧.软件系统当访问量不大 ...

  3. web应用程序性能优化

    web应用程序基本上都是在浏览器地址栏输入一段网站,然后进入,最后浏览器显示你想要的东西. 这就是用户所能体会到的东西.那作为程序员我们看到了什么呢? 一次HTTP 请求主要的流程是: 1.DNS服务 ...

  4. iOS 程序性能优化

    前言 转载自:http://www.samirchen.com/ios-performance-optimization/ 程序性能优化不应该是一件放在功能完成之后的事,对性能的概念应该从我们一开始写 ...

  5. C++ 应用程序性能优化

    C++ 应用程序性能优化 eryar@163.com 1. Introduction 对于几何造型内核OpenCASCADE,由于会涉及到大量的数值算法,如矩阵相关计算,微积分,Newton迭代法解方 ...

  6. java程序性能优化

    一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util ...

  7. Java程序性能优化——让你的java程序更快、更稳定

    1.Java性能调优概述 1.1.Web服务器,响应时间.吞吐量是两个重要的性能参数. 1.2.程序性能的几个表现: 执行速度:程序的反映是否迅速,响应时间是否足够短 内存分配:分配是否合理,是否过多 ...

  8. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  9. 《Java程序性能优化:让你的Java程序更快、更稳定》

    Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧

随机推荐

  1. flex和flex:1的含义

    一.flex详解 flex可以参考阮一峰老师的flex布局教程,很详细看完啥都懂了 链接:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.htm ...

  2. 黑马程序员_毕向东_Java基础视频教程——进制转换之负数二进制(随笔)

    进制转换之负数二进制 负数的二进制表现形式 6 = 110 -6 : 其实就是 6 的二进制取反再 + 1 一个整数在内存中是占 4 个字节 **取反:将二进制里的 1 变成 0,0 变成 1. 以6 ...

  3. node的buffer模块

    Buffer这块很早前就想留一篇笔记.前端JS处理buffer的场景其实并不多,虽然后来基于webGL与显卡通信的需求增加了二进制数组,但毕竟相对小众. Buffer的含义是,在数据传输时用内存中的一 ...

  4. Django操作cookie实例

     cookie项目文件: templates模板: login.html {% load static %} <!DOCTYPE html> <html lang="en& ...

  5. 如何在没有core文件的情况下用dmesg+addr2line定位段错误

    前言 在现网环境下,程序奔溃后不一定会留下core文件,原因有很多,比如存储空间不足就是其中一个常见的原因.此时我们只能依据linux记录的错误日志来定位问题. 涉及linux命令 本文涉及以下几条命 ...

  6. 破坏之王DDoS攻击与防范深度剖析【学习笔记】

    一.DDoS初步印象 1.什么是分布式拒绝服务攻击? 1)首先它是一种拒绝服务攻击 我们可以这么认为,凡是导致合法用户不能访问服务的行为,就是拒绝服务攻击. 注:早期的拒绝服务主要基于系统和应用程序的 ...

  7. 高版本Jenkins关闭跨站请求伪造保护(CSRF)

    前言 根据官网描述,Jenkins版本自2.204.6以来的重大变更有:删除禁用 CSRF 保护的功能. 从较旧版本的 Jenkins 升级的实例将启用 CSRF 保护和设置默认的发行者,如果之前被禁 ...

  8. redis学习——day02_redis数据类型

    一.简介 Redis不仅仅是简单的key-value 存储器,同时也是一种data structures server.传统的key-value是指支持使用一个key字符串来索引value字符串的存储 ...

  9. 洛谷P2754 [CTSC1999]家园

    题目链接:https://www.luogu.org/problemnew/show/P2754 知识点: 最大流 解题思路: 先用 \(DFS\) 判断是否无解. 从时刻 \(0\) 开始枚举答案, ...

  10. NPM的由来——为什么要使用NPM

    原文:https://blog.csdn.net/qq_37696120/article/details/80507178 https://blog.csdn.net/hong10086/articl ...