C / C ++编译器反馈优化

有没有人看过任何使用C / C ++编译器提供的反馈优化来支持分支预测,缓存预加载等function的程序的真实世界数字。

我搜索了它,令人惊讶的是,甚至流行的翻译开发小组似乎都没有检查过这种效果。 并且将ruby,python,php等性能提高10%左右应该被认为是有用的。

真的没有任何好处,或整个开发者社区只是懒得使用它?

10%是一个很好的球场数字。 那说,……

你必须真正关心这条路线的表现。 我所使用的产品(DB2)使用PGO和其他侵入性和侵略性优化。 成本包括显着的构建时间(在某些平台上为三倍)以及开发和支持梦魇。

当出现问题时,将优化代码中的故障位置映射回源是非常重要的。 开发人员通常不希望不同模块中的函数最终合并和内联,这可能会产生“有趣”的影响。

指针别名的问题,即令人讨厌的追踪也通常会出现这些种类的优化。 你有额外的乐趣,有非确定性的构建(一个别名问题可以出现在星期一的构建中,再次消失,直到星期四,…)。

在这些类型的积极优化下,正确或不正确的编译器行为之间的界限也变得相当模糊。 即使有我们的编译人员在内部(字面意思)的优点,优化问题(在我们的源代码或编译器中)仍然不容易理解和解决。

来自unladen-swallow (优化CPython VM的项目):

对我们来说,PyBench棺材的最后一件事就是在尝试使用gcc的反馈导向优化工具时,我们能够在宏基准测试中实现15%的通用性能提升。 使用相同的培训工作量,PyBench的速度降低了10%。

所以有些人至少在看它。 也就是说,PGO为构建环境设置了一些非常棘手的要求,这些要求很难满足开源项目的需求,这些项目意图由分布式的异构人群构建。 重型优化也会导致难以调试的heisenbugs。 为编译器提供性能关键部分的显式提示是不那么重要的。

也就是说,我预计运行时配置文件引导优化会显着提高性能。 JIT’ing允许优化器处理程序执行过程中数据更改的配置文件,并执行许多极其特定于运行时数据的优化,这些优化会破坏静态编译的代码大小。 特别是动态语言需要基于运行时数据的优化才能很好地运行 随着动态语言性能最近引起人们的极大关注(JavaScript VM,MS DLR,JSR-292,PyPy等),在这方面还有很多工作要做。

通过性能分析工具完成通过性能分析提高编译器效率的传统方法。 但是,工具中的数据如何用于优化仍取决于您使用的编译器。 例如,GCC是一个正在开发的框架,用于为不同的域生成编译器。 在这样的编译器框架中提供分析机制将是非常困难的。

我们可以依靠统计数据来进行某些优化。 例如,如果循环计数小于常量(例如7),GCC将展开循环。 如何修复常量将基于为不同目标体系结构生成的代码大小的统计结果。

配置文件引导优化跟踪源的特殊区域。 需要存储关于先前运行结果的细节,这是开销。 另一方面,输入需要可以使用编译器的目标应用程序的统计表示。 因此,复杂程度随着不同输入和输出的数量而增加。 简而言之,决定配置文件引导优化需要极端数据收集。 自动化或将此类分析嵌入到源中需要仔细监视。 如果没有,整个结果将是错误的,在我们游泳的努力中,我们实际上会淹死。

但是,正在进行这方面的试验。 看看POGO吧 。