对于需要大量计算资源的应用程序,高性能是在合理的时间内提供科学结果或实现“突破”的关键因素。
软件开发人员应该花多少时间和精力来优化应用程序?使用的关键标准是什么?
对于需要大量计算资源的应用程序,高性能是在合理的时间内提供科学结果或实现“突破”的关键因素。
软件开发人员应该花多少时间和精力来优化应用程序?使用的关键标准是什么?
Answers:
在大多数情况下,算法的改进比优化的改进有更大的不同。与低级优化相比,算法也更具可移植性。我的建议是遵循有关内存布局的一般最佳实践,以实现缓存重用,避免过多的副本或通信,以理智的方式对待文件系统,并使浮点内核具有足够的粒度来进行矢量化。有时,这足以达到可接受的“峰值”分数(对于此操作)。
始终为您认为重要的操作(或通过分析发现重要的操作)绘制性能模型。然后,您可以使用性能模型来估计高度调整的实现可以实现的目标。如果您认为提高速度是值得的(相对于您可能要做的其他事情),请进行优化。
也许最困难的挑战是设计高级的,重要的(在某种意义上说,很多代码将取决于这些选择)接口和数据结构,以便您以后可以进行优化而无需更改API。与特定的优化和一般准则相比,除经验外,我不知道该如何教授。使用性能敏感的开源软件会有所帮助。与任何API决定一样,了解问题空间也很重要。
您将如何定义“优化”?从更好的算法或计算模型的开发到使用手动调整的汇编器,范围广泛。
在我看来和经验不足的地方是中间的某个地方,例如选择最适合基础计算机体系结构的算法。该算法不一定必须是新颖的,并且您对底层体系结构的理解也不必非常具体,例如
无需太多底层知识即可访问所有上述功能,例如SIMD,并行性和GPU,但实际上仅在可以轻松利用它们的算法中提供了优势。
我同意到目前为止已经提出的所有答案...我只想解决代码优化的另一个被忽略的方面:质量期望。
当用户试图解决越来越大的问题并且代码不足以满足用户的需求/期望时,通常会出现代码优化的问题。一个人应该在代码优化上投入的时间取决于满足这一期望的需求。如果迫切需要竞争优势(例如,先完成并发表关于热门话题的研究),那当然值得投入大量时间。
当然,应该花费多少时间取决于所需的时间以及所需的代码的可移植性。通常,这两个需求相互冲突,因此在开始优化之前,您必须确定哪个更重要。您想要的可移植性越强,就越需要依靠对代码(算法/数据结构)的高级设计更改。您希望代码执行得更快,必须使用特定于特定计算机的低级优化(例如,代码/编译器/运行时优化)对其进行调整。
您必须对花费如此多的工时(花费通常是神话般的:-)进行(成本)分析,以提高执行速度。您必须弄清楚该软件将被使用多少次,以及有多少人可以使用,才能估算出收益。
与往常一样,经验法则是著名的80/20法则。在某个时刻,它并不会花费更多的时间来获得更少的百分比(或更少)的运行时间。但是您必须进行分析。
我衷心同意以上海报:确保您的API经过深思熟虑,因此不需要太多更改,并确保代码可移植且可维护(请考虑重新分析您编写的算法,并精打细算)十年前进行了优化)。并确保您使用良好的编程习惯和标准库。可能已经有人为您的应用程序考虑了最有效的算法,这是合理的。
引用Donald Knuth的话:“过早的优化是万恶之源”。因此,分析您的代码,但不要太早。