C/C++ 优化技巧

7

在编程方面,我一直以非常面向对象的方式学习,这意味着高度优化的代码不是我的强项。现在我已经相当擅长C语言,通常可以用比较聪明的方式完成任务,但我仍然难以想到最优化的处理情况。

举个例子:

int strlen(const char* str)
{
    char* s;
    for (s=str; *s; ++s);
    return s-str;
}

我自己从来没有想到过这一点。

那么,有哪些好的资源可以让你接触到像这样优化的代码?我想找一个地方,在那里我可以阅读背后的理论,编译器在背景中所做的使其值得的事情等等。

如果能有一些针对现实场景应用的优化数据结构的学习资源也不错,但这可能要求太高了。


3
那段代码相比于int count=0; while(str++) count++; return count;这个简单版本,有什么优化? - riwalk
2
@Stargazer712,Q版本中的算术操作数量只有一半。 - David Heffernan
11
这段代码并没有经过优化,而是被混淆了。 - David Heffernan
2
如果我确信的话,我就不会问这个问题了,但显然从我听到的消息来看,它更加优化。无论如何,这只是我的例子,我想要一本关于优化的好书/网站,以及如何“快速思考”。我一直以为自己在工作中做得很好,直到我开始面试金融公司。 - John Humphreys
2
优化以扩大维护预算? - Tom Kerr
显示剩余16条评论
2个回答

5
不要过度追求微小优化。随着现代编译器的发展,最好让这样的优化由编译器处理。花时间选择适合你的应用程序的正确算法和设计模式更加重要。找一个不错的分析工具并学会如何使用它。不要浪费时间试图弄清楚如何优化strlen
至于如何进行这些微小优化的参考资料,我之前已经提到过,但很乐意再次提及,Agner的指南非常出色,并且是免费的 :) 请查看: http://www.agner.org/optimize/ 应该有很多指南。
顺便说一句:我遇到的最优化的strlen版本是由Agner制作的:http://www.agner.org/optimize/asmlib-instructions.pdf 并且是用汇编语言编写的。;-)

2
我部分地同意。确实,选择算法和模式来优化时间更好,但在我看来,一个好的程序员应该考虑他正在编写的代码。当只需要5行代码时,抛出10行代码是无用的(当然,这不适用于strlen)。 - dave
1
是的,但大多数现代编译器都会为您节省时间。当人们要求进行优化并以"strlen"为例时,您知道他们所寻求的不是正确的原因。 - Tommy Andersen
我也稍微不同意。虽然通常是正确的,但有些情况下代码可能会引入限制,从而阻止某些优化的应用。每当程序员构建循环时,他们应该始终考虑每次迭代将产生多少操作(这真的不太难)。在许多情况下,循环内的额外函数调用超出了编译器优化的范围,因为存在副作用;这真的取决于程序员是否知道这一点。 - Peter

1

每个程序员都应该了解的关于内存的知识,第一部分是一个有趣的资源。它深入探讨了很多愚蠢的低级细节。

优化的主要目标之一是代码大小。如果你利用智能的面向对象设计和小型设计,你就在优化。我个人认为忽略小细节,专注于高层次的设计,会让你在速度和职业发展方面更进一步。此外,gprof比你更擅长这方面的工作。


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