具体描述
本书作者精通C程序性能优化,具有近二十年的C语言编译器和解释器开发经验,还为实时图像处理专用芯片开发过C编译器。
作者从CPU与编译器的运行机制讲起,带领读者一步步了解程序的执行成本、编译器的优化选项等,总结出许多C程序性能优化的技巧,并将这些技巧通过实验的方式进行讲解,简明易懂,使人印象深刻。书中带有大量的代码实例,使读者不仅能够了解代码优化的原理,还能够轻松地在实践中加以应用。
作者简介
片山善夫
具有近二十年的C语言编译器和解释器开发经验。现从事对SPARC、VisionChip等体系结构的研究。
目录信息
1.1 高速路与人行道 002
1.2 编译器是如何运作的 003
编译后的汇编语言程序 004
添加优化选项后的结果 007
1.3 CPU 是如何运作的 008
指令集架构与微架构 008
如何执行指令 009
指令流水线 011
高速缓存 012
深入探讨高速缓存 013
缓存块的替换算法 015
超标量指令执行 015
第1 章 是不是偏离了主题 017
第2 章 执行成本
2.1 两程序的执行成本 020
2.2 计·测·谋 020
书中的探讨 020
2.3 防止基准测试程序被优化 023
防止操作“归并” 023
防止变量在初始化时被优化 024
防止重复单一指令被优化 025
本书中的基准测试程序 026
2.4 验证——哪一步操作导致执行速度缓慢 029
2.5 基础加法与赋值运算 031
单一的赋值操作(寄存器间的传送) 032
单一的赋值操作(数据相互关联的情况) 032
常量赋值 033
变量间的加法运算 033
变量与常量相加 034
2.6 耗时的乘法运算 036
变量间的乘法运算 037
变量与常量相乘 037
2.7 更为耗时的除法运算 040
变量的除法(寄存器间的计算) 040
除数为2、4 的除法运算 042
除数不是2 的乘方的除法运算 042
无符号整数除法运算 042
除数为2 的乘方时除法运算使用低成本移位指令 043
2.8 内存读取 045
小数组的读取(小范围内的内存操作) 045
大数组的读取( 大范围内的内存操作) 047
与台式机的CPU进行比较 049
2.9 造成执行时间差别的判断语句 051
无else节点的if 语句 051
带else节点的if 语句 053
2.10 32/64 位环境中不同的函数调用 053
2.11 实验总结 055
若想被爱则先爱 055
第3 章 寻找性能瓶颈
3.1 使用gprof 命令进行分析 058
gprof的使用方法 058
3.2 哪个环节在消耗时间 058
获取库函数的评测信息 060
耗时的函数 062
显示库函数的调用次数 063
3.3 函数的调用关系 063
3.4 进行数据分析的原理 066
3.5 其他性能分析器 067
培养高水平人才的教育系统 068
第4 章 达人方法论
4.1 达人的关注点 072
硬件篇 072
编译器/ 中间件篇 074
算法篇 075
4.2 【硬件篇】数组和缓存的有效利用 076
矩阵的乘法运算 076
调整数组操作的顺序 077
展开循环的方式 078
矩阵的分块 079
4.3 【库函数篇】缓慢函数的迂回战术 080
strcmp 函数为何缓慢 080
优化的陷阱 081
4.4 【硬件篇】 使用SIMD 进行字符串对比 083
4.5 【库函数篇】对比各种输入输出方法 085
行输入函数的对比 085
输出方法 089
管道输入输出的特殊案例 091
管道输入输出与文件输入输出 092
4.6 【 算法篇】二分法查找与平衡二叉树 092
海量数据的分类 093
真要做到如此地步? 097
第5 章 进一步研究编译器
5.1 不同级别的优化选项 100
GCC 的优化选项 100
“零优化”对调试有效 100
以不出现未定义行为为前提的2 级以上优化选项 101
5.2 优化·寄存器·外部变量 102
5.3 删除公共子表达式为程序瘦身 104
5.4 指针与复杂运算简化 105
5.5 将用户函数进行内联展开 106
和别人拉开差距! 108
第6 章 给办公系统的一些启示
6.1 排序与字符串操作 112
6.2 小数点数的计算与字符串/ 数字的换算 112
块数据输入输出和字段分割 113
统计带小数部分的数 113
整数转换成字符串 115
性能优化的效果 116
6.3 半角字符转换为全角字符 117
判定字符的字节数 118
ASCII字符与半角片假名字符的判定 119
ASCII字符转换为全角字符 123
半角字符转换为全角字符 124
性能优化的效果 127
判定字符字节数的其他方法 127
有关UTF-8 130
6.4 探索具有某种数据特性的数组 132
数据的特性 133
二分法查找与线性查找相结合 135
性能优化的效果 138
后记 139
· · · · · · (收起)
读后感
应领导要求看了该书,领悟了一些东西,虽然有些方法不是很同意。我一直觉得应该写好代码框架,可读可维护,再抠性能。我们的目标应该是,用面向过程的高效语言(C),实现面向对象的思想,达到程序架构合理并高效的最终目标。 有些代码欠保护型处理,需要斟酌。部分关于cache的内...
应领导要求看了该书,领悟了一些东西,虽然有些方法不是很同意。我一直觉得应该写好代码框架,可读可维护,再抠性能。我们的目标应该是,用面向过程的高效语言(C),实现面向对象的思想,达到程序架构合理并高效的最终目标。 有些代码欠保护型处理,需要斟酌。部分关于cache的内...
应领导要求看了该书,领悟了一些东西,虽然有些方法不是很同意。我一直觉得应该写好代码框架,可读可维护,再抠性能。我们的目标应该是,用面向过程的高效语言(C),实现面向对象的思想,达到程序架构合理并高效的最终目标。 有些代码欠保护型处理,需要斟酌。部分关于cache的内...
应领导要求看了该书,领悟了一些东西,虽然有些方法不是很同意。我一直觉得应该写好代码框架,可读可维护,再抠性能。我们的目标应该是,用面向过程的高效语言(C),实现面向对象的思想,达到程序架构合理并高效的最终目标。 有些代码欠保护型处理,需要斟酌。部分关于cache的内...
应领导要求看了该书,领悟了一些东西,虽然有些方法不是很同意。我一直觉得应该写好代码框架,可读可维护,再抠性能。我们的目标应该是,用面向过程的高效语言(C),实现面向对象的思想,达到程序架构合理并高效的最终目标。 有些代码欠保护型处理,需要斟酌。部分关于cache的内...
用户评价
我在阅读的过程中,最大的感受就是这本书的实用性。它不像一些纯理论的书籍那样,读完之后感觉离实际应用还有十万八千里。这本书的每一章都紧密联系着如何改进 C 程序的性能。例如,在讲到内存管理的时候,作者并没有仅仅停留在 `malloc` 和 `free` 的概念上,而是深入地探讨了内存分配器的选择、内存对齐的重要性,以及如何通过数据结构的设计来减少内存碎片。这些都是在实际项目中非常容易被忽视,但却对性能有着决定性影响的细节。 让我尤其受启发的,是关于并行计算和多线程优化的部分。在如今多核处理器遍地的时代,如何充分利用多核资源是提升性能的关键。这本书没有回避这个复杂的话题,而是从基础的线程同步、锁机制,到更高级的原子操作、无锁数据结构,都进行了清晰的阐述。并且,它还提供了一些实用的策略,比如如何识别代码中的并行化机会,以及如何避免常见的并行化陷阱,如数据竞争和死锁。这对我来说,是解决当前项目瓶颈的直接指导。
这本书最吸引我的地方,在于它不仅仅是枯燥的技术罗列,而是能够将复杂的 C 程序性能优化原理,以一种相对易于理解的方式呈现出来。作者在讲解过程中,大量运用了比喻和类比,让我能够快速抓住核心概念。比如,在解释缓存一致性的时候,作者用了“多个厨师共享一个菜谱”的比喻,这让我一下子就明白了不同 CPU 核心之间如何协调对共享数据的访问。 另外,书中关于算法和数据结构对性能影响的讨论,也给我带来了很多启发。很多时候,我们一味地去优化某个函数,却忽略了从源头上选择一个更高效的算法。这本书提醒我,有时候一个更精妙的数据结构或者算法,带来的性能提升远比对现有代码做微小改动要大得多。它鼓励我去思考,在解决问题时,是否还有更好的方式。这不仅仅是关于 C 程序的性能,更是关于如何成为一个更优秀的程序员。
我一直对如何让我的 C 代码跑得更快充满了好奇,尤其是在处理那些数据密集型或者计算量大的项目时。市面上关于 C 语言的书籍非常多,但很多都侧重于语法、数据结构或者操作系统层面的原理。《C程序性能优化》这本书,我抱着极大的期待去翻阅,希望它能给我带来一些切实可行的技巧和深入的理解。 打开这本书,我首先被它清爽的排版和清晰的章节划分吸引了。作者似乎花了心思去组织内容,让读者能够循序渐进地掌握那些复杂的优化概念。我比较喜欢的是它在介绍每个优化技术时,都会附带一些实际的 C 代码示例。这些示例往往不是那种脱离实际的理论模型,而是更贴近我们在实际开发中可能会遇到的场景。比如,关于缓存局部性的讨论,作者就通过一个简单的二维数组遍历的例子,生动地展示了不同访问顺序对性能的影响,并且给出了性能对比的数据。这让我能够直观地感受到理论知识是如何转化为实际效果的。
对于一个像我这样,在实际项目开发中遇到性能瓶颈的开发者来说,这本书的内容无疑是雪中送炭。它不仅仅是告诉你“这样做更快”,而是深入地剖析了“为什么”这样做会更快。我特别欣赏作者在讲解编译器的优化选项时,那种抽丝剥茧的分析。很多时候,我们只是简单地加上 `-O2` 或 `-O3`,却不清楚这些选项背后到底做了什么。这本书则一一列举了常见的优化策略,比如循环展开、函数内联、死代码消除等等,并解释了编译器是如何识别并应用这些策略的。这让我感觉我不仅仅是在使用工具,而是真正理解了工具的工作原理,从而能够更明智地选择和配置编译选项。 更让我印象深刻的是,作者并没有止步于基础的编译器优化,而是将视野拓展到了更底层的硬件层面。对于 CPU 架构、指令集以及内存层次结构的讲解,虽然篇幅不算特别长,但却恰到好处地为理解后续的优化技巧打下了坚实的基础。我以前对这些概念可能有些模糊的认识,但通过书中的图示和解释,我才真正理解了为什么流水线、分支预测这些概念与 C 代码的执行效率息息相关。这让我觉得,这本书不仅仅是教你写 C 代码,更是在培养你成为一个更懂得硬件、更懂计算机底层运作的开发者。
这本书的结构设计非常合理,内容层次分明,让我在阅读时能够清晰地把握知识脉络。从最基础的编译器优化到更高级的硬件层面原理,再到算法和数据结构的选择,每一个环节都衔接得非常自然。我尤其喜欢书中关于性能分析工具的介绍,比如 `gprof` 和 `perf`。作者详细解释了如何使用这些工具来定位程序的性能瓶颈,并且如何根据分析结果来指导优化方向。这让我感觉我拥有了一套完整的“诊断”和“治疗” C 程序性能问题的工具箱。 此外,书中还涉及了一些更前沿的优化技术,比如 SIMD 指令的应用。虽然这部分内容可能对初学者来说有些挑战,但作者用深入浅出的方式进行了解释,并给出了相应的代码示例。这让我看到了 C 程序性能优化的无限可能性,并且激励我去进一步探索这些强大的技术。这本书让我觉得,性能优化不仅仅是“把代码写得小一点”,而是一门涉及多方面知识的系统工程。
这翻译得也是醉了,fgets和getline那一部分看不懂。醉了,对于有强迫症的低水平的人来说,这真是毒药啊。2016-6-27。
3个小时就可以看完 基本上没有给出什么有用的建议 10块钱的小册子还值得一翻,29块的价格绝对是抢钱了
实用性强,提供了高性能代码编写思路
一般般,多数的技巧都是已知的。
价值不大,快餐书籍,读着玩玩还行。书中有印刷错误,部分内容描述不够清楚。可以简单的翻一下,扩展思路。