附录 A. 开发者小贴示

每本优秀的编程课本都包含内存分配以及具体功能性能的问题。当您开发自己的软件时,请注意可能在运行该软件的系统中增加电源消耗的问题。虽然这些考虑不会影响每一行代码,但您可以优化那些经常成为性能瓶颈部分的代码。
经常会出问题的技术包括:
  • 使用线程。
  • 不必要的唤醒 CPU 或者未有效使用唤醒。如果您必须执行唤醒,尽快一次做完所有的事(迅速返回闲置状态)。
  • 不必要的使用 [f]sync()
  • 不必要的活跃调用或者使用简短常规超时(使用响应事件)。
  • 未有效使用唤醒。
  • 低效磁盘访问。使用大量缓冲来避免频繁的磁盘访问。一次写入大块信息。
  • 低效使用计时器。可能时使用跨应用程序(甚至跨系统)的组群计时器。
  • 过量的 I/O、电源消耗或者内存使用(包括内存泄露)。
  • 执行不必要的计算。
下面的部分将对这些方面进行更详细地阐述。

A.1. 使用线程

大家普遍认为使用线程能够更好且更迅速地执行应用,但情况并不总是如此。
Python

Python 使用全局锁定解码器[1],因此使用线程只能在有大量 I/O 操作时受益。Unladen-swallow [2] 是一个 Python 快速部署,您可用它来优化您的代码。

Perl

Perl 线程原是用于系统中不使用分叉技术的应用程序的(比如使用 32 位 Windows 操作系统的系统)。在 Perl 线程中会为每个单一线程复制数据(写时复制)。数据不是默认共享的,因为用户应该可以定义数据共享等级。必须包括共享 threads::shared 模块的数据。但是数据不仅仅是被复制(写时复制),该模块还为这些数据生成了捆绑变量,这就需要更多的时间,且速度更慢。[3]

C

C 线程共享同一内存,每个线程都有自己的层叠,同时 kernel 不一定要生成新的文件描述符并分配新的内存空间。C 可以真正在更多线程中使用更多 CPU 支持。因此要最大化您的线程性能,请使用低级语言,比如 C 或者 C++。如果您使用脚本语言,请考虑写入一个 C 绑定。请使用分析器识别不能很好执行的代码。[4]