【提高C++性能的编程技术】读书笔记1 -- 导言

【纸上得来终觉浅】

最近开始看这本书,站在巨人的肩膀上,希望有更大的收获!!

一个程序的执行效率是取决于改程序翻译成汇编语言之后的执行的机器指令的条数。而每一个机器指令的执行的周期是一定的。C语言和C++都是高于汇编语言的高级语言,其中,C语言源代码与其相应的机器指不是完全同一的,但是大致是线性的,但是C++语言的源代码与编译代码的开销变化很大的。一条C++指令可能对应于3条汇编指令,而另外的一条可能对应300条。正因为这样,很多时候我们写出来的代码本身就是低效的,这不能全然怪罪于C++语言本身,那么真正的软件的低效又体现在什么地方呢?

软件性能

设计的效率
编码的效率

算法与数据结构,程序分解
语言结构,系统体系结构 , 库,编译器优化

总得来说,软件的效率是由设计的效率以及编码的效率来决定的,其中,设计的效率关乎程序的高层设计,也就是说你要有把握全局的能力,在很大的程度上,这与语言本身并没有关系,无论再怎么高效的语言都弥补不了糟糕的全局设计。

提到全局设计,数据结构与算法的设计是不得不提的。算法与数据结构的最优化设计绝对是软件性能的必要条件。其次,程序分解,则是指整个程序分解为几个不同的模块,模块之间的交互,以及各个模块的设计。

在完成了上述这些必要的设计之后,编码的效率便提上日程了,语言的结构便是语言本身的结构产生的一些开销对程序性能的影响。系统的体系结构,不考虑体系结构的开发是无用的。现实世界没有无限的内存,无限的计算能力,并行的线程执行,想当然的代码注定是会烂掉的。因此,我们必须铭记于心的是“内存不是无限大的”,“内存访问开销并不是均衡的,对于不同的存储介质的访问时间是有着数量级的差别的”,“我们的程序没有专门的CPU”,“在一台单处理器的计算机上,并行的程序只能是轮询的”。第三点,便是库的选择,库函数的实现是奔着重用性的,这其中对于性能必定有所折中,因此在面对性能严苛的代码段时,自己实现也未尝不可。最后,是编译器的问题了,编译器的优化技术也是影响程序性能的点。但是绝对要记住,不要依赖编译器的优化,而写出低效的代码,应该尽量不依赖编译器的优化。

上述几个因素,是影响程序性能的点,同时也是立志编写出高效的代码的编程人员应该时刻谨记的。

今天读完导言,收益颇丰,很快就可以开始读这本书了,期待C++带给我的更多的惊喜!!!

时间: 2024-10-13 15:30:20

【提高C++性能的编程技术】读书笔记1 -- 导言的相关文章

转载--提高C++性能的编程技术

读书笔记:提高C++性能的编程技术 第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况下不会开启Trace功能.问题是:怎么设计Trace类,使得在不开启Trace功能时引入的开销最小. 1.2 使用状态变量开关功能 用宏来开关Trace功能很简单,在不开启时开销完全没有: #ifdef TRACE Trace trace("aaa"); #endif 缺点是每次开关都需要重新

读书笔记:提高C++性能的编程技术

第1章 跟踪范例 1.1 关注点 本章引入的实际问题为:定义一个简单的Trace类,将当前函数名输出到日志文件中.Trace对象会带来一定的开销,因此在默认情况下不会开启Trace功能.问题是:怎么设计Trace类,使得在不开启Trace功能时引入的开销最小. 1.2 使用状态变量开关功能 用宏来开关Trace功能很简单,在不开启时开销完全没有: #ifdef TRACE Trace trace("aaa"); #endif 缺点是每次开关都需要重新编译. 使用状态变量的话有一定的运行

【提高C++性能的编程技术】读书笔记2 -- 跟踪实例

[纸上得来终觉浅] 这里所说的跟踪指的是跟踪程序的运行过程.这里讨论跟踪,旨在如何利用高效的跟踪的代码,使得跟踪尽可能不增加源程序的额外开销. 这里的跟踪其实很直观,就是顺着程序运行的轨迹,怎样打印出程序的每一个阶段的运行状态的log信息.因此,如何跟踪代码便是一个核心的问题.不当的跟踪方式会导致运行开销的增大.因此怎样设计出高效的跟踪技术是我们学习怎样写出高效的C++代码的一个很好的突破口. 鉴于C++的面向对象的特征,最直观的便是定义一个简单的Trace类将程序的状态信息打印到日志文件中,程

《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记

造成开销的操作包括: 1. 线程之间的协调(例如:锁.触发信号以及内存同步等) 2. 增加的上下文切换 3. 线程的创建和销毁 4. 线程的调度 一.对性能的思考 1 性能与可伸缩性 运行速度涉及以下两个指标: 某个指定的任务单元需要"多快"才能处理完成.计算资源一定的情况下,能完成"多少"工作. 可伸缩性: 当增加计算资源时(例如:CPU.内存.存储容器或I/O带宽),程序的吞吐量或者处理能力能相应地增加. 2 评估各种性能权衡因素 避免不成熟的优化.首先使程序正

【转】《windows核心编程》读书笔记

这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLastError可能用于描述成功的原因(CreatEvent)

《C专家编程》读书笔记

<C专家编程>读书笔记 C语言的设计哲学: 一切工作程序员自己负责. 语言中的所有特性都不需要隐式的运行时支持. 程序员所做的都是对的. 程序员应该知道自己在干什么,并保证自己的所作所为是正确的. --第1章-- C: 穿越时空的迷雾 小即是美.事物发展都有个过程,由简入繁,不能一开始就想得太复杂,Multics, IBM的OS/360都是因此而失败. C语言的许多特性是为了方便编译器设计者而建立的.----唉,怎么这个样子 C语言的基本数据类型直接与底层硬件相对应.----确实如此 regi

《Unix环境高级编程》读书笔记 第3章-文件I/O

1. 引言 Unix系统的大多数文件I/O只需用到5个函数:open.read.write.lseek以及close 本章描述的函数经常被称为不带缓冲的I/O.术语不带缓冲指的是在用户的进程中对其不会自动缓冲,每个read和write都调用内核中的一个系统调用.但是,所有磁盘I/O都要经过内核的块缓存区(也称为内核的缓冲区高速缓存).唯一例外的是对原始磁盘设备的I/O. 2. 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数,其变化范围是0~OPEN_MAX

《Windows核心编程》读书笔记 上

[C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入,但应该是合理的.开头几章由于我追求简洁,往往是很多单独的字句,后面的内容更为连贯. 海量细节. 第1章    错误处理 1.         GetLastError返回的是最后的错误码,即更早的错误码可能被覆盖. 2.         GetLas

《C#高级编程》读书笔记

<C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) short System.Int16 16位有符号的整数 -32 768~32 767(−215−215~215−1215−1) int System.Int32 32位有符号的整数 -2 147 483 648~2 147 483 647(−231−231~231−1231−1) long System.Int