《C语言接口与实现:创建可重用软件的技术》一1.3 效率

简介:

本节书摘来自异步社区《C语言接口与实现:创建可重用软件的技术》一书中的第1章,第1.3节,作者 傅道坤,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.3 效率

程序员似乎被效率问题困扰着。他们可能花费数小时来微调代码,使之运行得更快。遗憾的是,大部分这种工作都是无用功。当猜测程序的运行时间花费在何处时,程序员的直觉非常糟糕。

微调程序是为了使之更快,但通常总是会使之更大、更难理解、更可能包含错误。除非对执行时间的测量表明程序太慢,否则这样的微调没有意义。程序只需要足够快即可,不一定要尽可能快。

微调通常在“真空”中完成。如果一个程序太慢,找到其瓶颈的唯一途径就是测量它。程序的瓶颈很少出现在预期位置或者是因你所怀疑的原因导致,而且在错误位置上微调程序是没有意义的。在找到正确的位置后,仅当该处花费的时间确实占运行时间的很大比例时,才有必要进行微调。如果I/O占了程序运行时间的60%,在搜索例程中节省1%是无意义的。

微调通常会引入错误。最快崩溃的程序绝非胜者。可靠性比效率更重要;与交付足够快的可靠软件相比,交付快速但会崩溃的软件,从长远看来代价更高。

微调经常在错误的层次上进行。快速算法的直接简明的实现,比慢速算法的手工微调实现要好得多。例如,减少线性查找的内层循环的指令数,注定不如直接使用二分查找。

微调无法修复低劣的设计。如果程序到处都慢,这种低效很可能是设计导致的。当基于编写得很糟糕或不精确的问题说明给出设计时,或者根本就没有总体设计时,就会发生这种令人遗憾的情况。

本书中大部分代码都使用了高效的算法,具有良好的平均情况性能,其最坏情形性能也易于概括。对大多数应用程序来说,这些代码对典型输入的执行时间总是足够快速的。当某些程序的代码性能可能会导致问题时,书中自会明确注明。

一些C程序员在寻求提高效率的途径时,大量使用宏和条件编译。只要有可能,本书将避免使用这两种方法。使用宏来避免函数调用基本上是不必要的。仅当客观的测量结果表明有问题的调用的开销大大超出其余代码的运行时间时,使用宏才有意义。操作I/O是较适宜采用宏的少数情况之一。例如,标准的I/O函数getc、putc、getchar和putchar通常实现为宏。

条件编译通常用于配置特定平台或环境的代码,或者用于代码调试的启用/禁用。这些问题是实际存在的,但条件编译通常只是解决问题的较为容易的方法,而且总会使代码更难于阅读。而重写代码以便在执行期间选择平台依赖关系通常则更为有用。例如,一个编译器可以在执行时选择多种(比如说6种)体系结构中的一个来生成代码,这样的一种交叉编译器要比必须配置并搭建6个不同的编译器更有用,而且可能更易于维护。

如果应用程序必须在编译时配置,与C语言的条件编译工具相比,版本控制工具更擅长完成该工作。这样,代码中就不必充斥着预处理器指令,因为那会使代码难于阅读,并模糊被编译和未被编译的代码之间的界限。使用版本控制工具,你看到的代码即为被执行的代码。对于跟踪性能改进情况来说,这些工具也是理想的选择。

相关文章
|
1月前
|
Linux C语言 iOS开发
C语言结合AWTK开发HTTP接口访问界面
这样,我们就实现了在C语言中使用libcurl和AWTK来访问HTTP接口并在界面上显示结果。这只是一个基础的示例,你可以根据需要添加更多的功能和优化。例如,你可以添加错误处理机制、支持更多HTTP方法(如POST、PUT等)、优化用户界面等。
77 26
|
6月前
|
C语言 开发者
C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧
本文深入探讨了C语言中的模块化编程思想,介绍了模块化编程的概念、实现方式及其优势,强调了合理划分模块、明确接口、保持独立性和内聚性的实践技巧,并通过案例分析展示了其应用,展望了未来的发展趋势,旨在帮助读者提升程序质量和开发效率。
198 5
|
6月前
|
人工智能 安全 算法
基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。
本文深入探讨了基于C语言的嵌入式系统开发,涵盖嵌入式系统概述、C语言的优势、开发流程、关键技术、应用实例及面临的挑战与未来趋势。C语言因其高效、可移植、灵活及成熟度高等特点,在嵌入式系统开发中占据重要地位。文章还介绍了从系统需求分析到部署维护的完整开发流程,以及中断处理、内存管理等关键技术,并展望了嵌入式系统在物联网和人工智能领域的未来发展。
263 1
|
9月前
|
传感器 IDE 编译器
C语言与硬件接口
C语言与硬件接口
|
11月前
|
存储 移动开发 C语言
技术心得记录:嵌入式开发中常用到的C语言库函数
技术心得记录:嵌入式开发中常用到的C语言库函数
114 1
|
11月前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
106 7
|
11月前
|
SQL 数据库 C语言
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
【sqlite的C语言访问接口】执行SQL语句的接口------sqlite3_exec回调函数的使用
|
12月前
|
存储 缓存 算法
动态数组技术详解及其在C语言中的应用
动态数组技术详解及其在C语言中的应用
203 0
|
12月前
|
C语言
C语言中的字符串处理函数技术详解
C语言中的字符串处理函数技术详解
156 1
|
12月前
|
存储 C语言
向函数传递字符串: C语言中的技术与实践
向函数传递字符串: C语言中的技术与实践
682 0