附录 A. 开发人员提示
每个良好的编程书都涵盖内存分配和特定功能性能的问题。在开发软件时,请注意可能会增加软件运行系统的功耗的问题。虽然这些注意事项不会影响每一行代码,但您可以优化代码在性能频繁瓶颈的区域。
一些通常有问题的技术包括:
- 使用线程。
- 不必要的 CPU 唤醒,且不有效地使用唤醒。如果需要唤醒,请一次性执行所有操作(停止闲置),并尽快进行。
- 不必要地使用
[f]sync()
。 - 不必要的活动轮询或使用短、常规超时。(改为使用事件)。
- 不有效地使用唤醒。
- 磁盘访问效率低。使用大型缓冲区以避免频繁访问磁盘。一次编写一个大块。
- 计时器的使用效率低下。如果可能,跨应用程序(甚至跨系统)分组计时器。
- 过量 I/O、功耗或内存使用情况(包括内存泄漏)
- 执行不必要的计算。
以下部分更详细地检查其中的一些区域。
A.1. 使用线程
众所周知,使用线程使应用程序性能更好、更快,但在每一个情况下都不是如此。
Python
Python 使用 Global Lock Interpreter[1]因此,线程处理只适用于更大的 I/O 操作。unladen-swallow [2] 是更快速的 Python 实施,您可能需要优化代码。
Perl
Perl 线程最初是为没有分叉(如具有 32 位 Windows 操作系统的系统)的系统上运行的应用程序创建的。在 Perl 线程中,会为每个单个线程复制数据(复制 On Write)。默认情况下,数据不共享,因为用户应该能够定义数据共享级别。对于共享 threads::shared 模块的数据,必须包含它们。但是,数据不仅会被复制(复制 On Write),但模块还会为数据创建绑定的变量,这需要更长的时间,甚至较慢。[3]
C
c 线程共享相同的内存,每个线程都有自己的堆栈,且内核不必创建新的文件描述符并分配新的内存空间。C 真正可以将更多 CPU 支持用于更多线程。因此,要最大化线程的性能,请使用 C 或 C++ 等低级别语言。如果您使用脚本语言,请考虑编写 C 绑定。使用配置文件器确定执行代码不佳的部分。[4]