是否有任何研究或一组基准显示由于在 GCC(或其他编译器中的等效项)中指定 -fno-strict-aliasing 而导致性能下降?
原文由 Carlos 发布,翻译遵循 CC BY-SA 4.0 许可协议
是否有任何研究或一组基准显示由于在 GCC(或其他编译器中的等效项)中指定 -fno-strict-aliasing 而导致性能下降?
原文由 Carlos 发布,翻译遵循 CC BY-SA 4.0 许可协议
我可以从经验告诉你(在 PS3 上用一个大型项目对此进行了测试,PowerPC 是一种架构,由于它有很多寄存器,实际上可以很好地从 SA 中受益)是你将看到的优化通常会非常本地化(范围明智)并且很小。在一个 20MB 的可执行文件上,它可能会刮掉 80kb 的 .text 部分(= 代码),这一切都在小范围和循环中。
此选项可以使您生成的代码比现在更轻量级和优化(考虑在 1% 到 5% 的范围内),但不要期望任何大的结果。因此,使用 -fno-strict-aliasing 的效果可能根本不会对您的性能产生很大影响。也就是说,拥有需要 -fno-strict-aliasing 的代码充其量只是次优情况。
原文由 nielsj 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
不同的编译器会有很大的不同,因为不同的编译器会以不同的攻击级别来实现它。 GCC 对此相当激进:启用严格别名会导致它认为“明显”等同于人类的指针(如
foo *a; bar *b = (bar *) a;
)不能别名,这允许一些非常激进的转换,但是显然可以破坏非精心编写的代码。由于这个原因,Apple 的 GCC 默认禁用严格别名。相比之下,LLVM 甚至 没有 严格的别名,而且,虽然这是计划中的,但开发人员表示他们计划在没有其他方法可以判断等效性时将其作为备用案例来实现。在上面的例子中,它仍然会判断 a 和 b 等价。如果它不能以任何其他方式确定它们的关系,它只会使用基于类型的别名。
根据我的经验,严格别名的性能影响主要与循环不变的代码运动有关,其中类型信息可用于证明循环内加载不能对正在迭代的数组进行别名,从而允许它们被拉出循环。 YMMV。