对于那些希望挤出每一个时钟周期的人,他们会谈论流水线、缓存局部性等低级性能技巧。
1. 我看过这些低级性能技巧在各处提到,但我没有看到一个从头到尾的好介绍。有什么资源推荐吗?(谷歌给了我定义和论文,我真的很感激一些实际案例/教程/真实操作材料)
2. 如何测量这种东西?比如说,像某种剖析器一样?我知道我们总是可以改变代码,看到改进并回顾理论,我只是想知道是否有已经建立的工具来完成这项工作。
(我知道算法优化是数量级的关键所在。我对这里的底层技术感兴趣)
time { commands ; }
,但你可能想使用一个功能齐全的分析器。GNU gprof是开源的,网址是:http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html
如果这真的是你的事情,那就去吧,玩得开心,记住,大量的位级数学。但你的维护者会讨厌你 ;)编辑/重写:
如果你需要书籍,Michael Abrash在这个领域做得很好,比如《汇编语言禅宗》,一些杂志文章,《大黑色图形编程书》等。他调整的许多问题现在已经不再是问题了,问题已经改变。从中你可以得到引起瓶颈的各种想法和解决问题的方法。最重要的是计时,以及了解你的计时测量如何工作,这样你就不会因错误的测量而自欺欺人。计时不同的解决方案,并尝试疯狂、奇怪的解决方案,你可能会发现一个优化,你之前并不知道,直到你暴露出来为止。
我刚开始阅读《See MIPS Run》(早期/第一版),到目前为止看起来不错(请注意,ARM已经取代MIPS成为处理器市场的领导者,所以MIPS和RISC的热度有点过时了)。关于MIPS有很多新旧教科书可供选择。MIPS被设计用于性能(在某些方面牺牲了软件工程师的利益)。
今天的瓶颈分为处理器本身和周围的I/O以及连接到该I/O的内容。处理器芯片本身(对于高端系统)的内部运行速度比I/O能够处理的速度快得多,因此你只能在等待外部操作时进行调整。当火车行驶了3个小时,从火车到目的地节省半分钟的时间并不一定是一个值得优化的决策。
这一切都关乎学习硬件,你可能可以留在1和0的世界中,而不必涉及实际电子技术。但是如果你不真正了解接口和内部结构,你就不能进行太多的性能调整。你可能会重新排列或更改几个指令,并获得一些提升,但要使某个东西变快数百倍,你需要更多的技巧。学习许多不同的指令集(汇编语言)有助于进入处理器。我建议模拟HDL,例如opencores上的处理器,以了解一些人如何设计他们的产品,并掌握如何从任务中真正挤出时钟。处理器知识很重要,需要学习内存接口,媒体(闪存、硬盘等)、显示和图形、网络以及所有这些东西之间的各种接口类型。最重要的是要理解时钟级别或尽可能接近它的水平。
英特尔和AMD提供x86和x86-64的优化手册。
http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html/
http://developer.amd.com/documentation/guides/pages/default.aspx
另一个优秀的资源是agner。
http://www.agner.org/optimize/
以下是一些关键点(没有特定顺序):
是的,测量,并且是的,了解所有这些技术。
有经验的人会告诉你“不要过早优化”,我理解为简单地“不要猜测”。
他们还会说“使用性能分析器找到瓶颈”,但我对此有些问题。我听到很多人使用性能分析器的故事,要么非常喜欢它们,要么对其输出感到困惑。Stack Overflow上充满了这样的故事。
我听不到很多关于取得成功的速度提升的故事。
我使用的方法非常简单,我尽量给出了很多例子,包括这个案例。