代码优化

11
你被赋予一堆你最喜欢的编程语言代码,这些代码组合在一起形成了一个相当复杂的应用程序。它运行得相当慢,你的老板要求你进行优化。你会采取哪些步骤来最有效地优化代码? 在优化代码时,你发现哪些策略是不成功的重写:你何时决定停止优化并说“如果不完全重写,它就只能运行这么快了”?在什么情况下,您会提倡进行简单的完全重写?您将如何设计它?

我应该将这个问题拆分成多个吗? - Claudiu
我认为这是一个很好的问题。它实际上是一堆概念的集合,最好作为一个整体来处理。 - Mike Dunlavey
12个回答

0

在Linux上,我在C和C++中进行了大量数值计算的优化。我发现,虽然分析工具很有用,但它们可能会扭曲你的运行时间结果,使得一些廉价、频繁调用的操作(如c++迭代器增量)看起来比实际情况更耗时。因此,要对这些结果持保留态度。

在实际策略方面,可以采取以下措施来提高速度:

  1. 使用数字数组而不是对象数组。例如,c++有一个“Complex”数据类型。对这些数组的操作比对两个浮点数数组进行类似操作要慢得多。这可以推广到任何性能关键代码中的“使用机器类型”。
  2. 编写代码以允许编译器在其优化方面更加有效。例如,如果您有一个固定大小的数组,请使用数组索引,以便自动向量化(Intel编译器的一个特性)可以工作。
  3. SIMD指令可以为您的问题提供良好的加速,如果您的问题适合它们设计的领域(同时乘除浮点数或整数)。这些都是MMX、SSE、SSE2等内容。
  4. 对于不需要精确值的昂贵函数,使用插值查找表。这并不总是好的,因为在内存中查找数据本身可能很昂贵。

希望这能给您一些启示!


0

正如其他人已经提到的,分析是你的第一步。

我想补充说,将重点放在数据结构和算法上作为第一步通常比直接深入微观优化更有利可图。

首先,编译器通常会为您执行许多经典的优化技巧(而且通常比您做得更好)。这在更现代的语言(如C#)中尤其如此,因为编译器对程序结构有更多的了解;更糟糕的是,通过“优化”代码来混淆它实际上可能会使编译器难以应用自己更有效的优化。

但大多数情况下,当您开始改进操作的大O时,就有更多的改进空间。例如,搜索链表的时间复杂度是O(n),这意味着搜索所需的时间与其中存储的数据量以相同的速率增加。而搜索哈希表只需要O(1)的时间复杂度,因此您可以添加更多数据而不增加搜索时间(当我们离开理论世界时还有其他因素,因此这并不完全正确,但大多数情况下是正确的)。

调整循环使其从高到低运行,以便生成的代码可以使用JumpIfZero而不是JumpIfLessThan来节省几个时钟周期,这样做可能不会产生同样程度的影响!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接