【问题标题】:Can all compile-time optimizations be done with link-time optimization?所有编译时优化都可以通过链接时优化来完成吗?
【发布时间】:2015-02-24 14:48:46
【问题描述】:

或者是否有一些优化只能在编译时完成(因此只能在编译单元内工作)?我问是因为在 C 中,编译单元是一个源文件,我试图了解在某些情况下是否有任何理由不将源代码拆分为单独的文件(例如,如果所有源代码都可以进行优化在一个文件中没有完成)。

【问题讨论】:

  • 哇 - 一次完成所有代码 - 我不想成为跟随你的人必须维护这个..
  • 链接时优化如何处理函数内的代码修剪?也许我不明白这个问题......
  • 是的,引入 LTO 是为了启用所有优化,而无需从源代码中一次性编译所有内容(无论是一次多个 TU 还是一个 TU)。
  • @Nim,一个文件中的所有代码:)
  • @DurnWhippersnapper 与许多编程相关的问题一样,在任何情况下 执行X 会导致性能下降? ,答案大概是字面意思,是的;实际上,不会。总会有你可能会编造出来的病态病例,但这并不意味着你应该担心它们。

标签: c optimization lto


【解决方案1】:

一个典型的(简化的)编译可能看起来像

1) Pre-process
2) Parse code to internal representation
3) Optimize code
4) Emit assembly language
5) Assemble to .o file
6) Link .o file to a.out 

LTO 通常通过在第 2 步和第 3 步之间将内部编译器表示转储到磁盘,然后在最后的链接(第 6 步)期间返回并执行第 3-5 步来实现。然而,这可能取决于编译器和版本。如果它遵循这种模式,那么您会看到 LTO 等同于编译时优化。

然而……

拥有非常大的源文件可能很烦人——Emacs 开始阻塞大于 10MB 的源文件。

如果您处于多用户开发环境中,根据您的 SCM,如果多个工程师正在处理同一个文件,您可能会遇到很多麻烦。

如果您使用分布式构建系统,您可以并行执行编译。因此,如果每个编译和优化一个文件需要 1 秒,并且您有 1000 个文件和 1000 个构建代理,那么您的总编译时间是 1 秒。如果您在决赛期间对所有 1000 个文件进行所有优化,那么您将有 999 个代理处于空闲状态,而 1 个代理会花费很长时间进行所有优化。

【讨论】:

    【解决方案2】:

    学术例子:

    main()
    {
      int i;
      for (i = 0; i < MAX; i++) {
        fun(i);
      }
    }
    
    fun(int i)
    {
      if (i == 0) {
        doSomething();
      }
    }
    

    如果fun在同一个编译单元中,并且启用了data-flow-analys,则可以将foor-loop优化为单个函数调用。

    但是:我会坚持 MooseBoys 的评论。

    【讨论】:

      猜你喜欢
      • 2021-12-15
      • 2016-07-23
      • 2023-04-10
      • 1970-01-01
      • 2017-05-27
      • 2016-07-21
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多