问题标签 [compiler-optimization]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
6701 浏览

c++ - 编译器是否决定何时内联我的函数(在 C++ 中)?

我知道您可以使用 inline 关键字,或者只是将一个方法放在类声明中,比如短 ctor 或 getter 方法,但是编译器是否会最终决定何时内联我的方法?

例如:

如果编译器认为它会使我的代码效率低下,它会忽略我的内联声明吗?

作为一个附带问题,如果我在我的类之外声明了一个 getter 方法,如下所示:

编译器会在幕后内联吗?

0 投票
4 回答
704 浏览

c++ - 优化 switch 语句时的 Visual Studio 2005 C 编译器问题

其他人可能感兴趣的一般问题:

我遇到了一个使用 switch 语句的 C++ 编译器优化 (Visual Studio 2005) 问题。我想知道的是是否有任何方法可以满足我的好奇心并找出编译器正在尝试但未能做到的事情。有没有我可以花一些时间(可能太多时间)破译的日志?

对于那些好奇地继续阅读的人来说,我的具体问题- 我想听听你对我为什么在这个具体案例中遇到问题的想法。

我有一个大约 500 行代码的小程序,其中包含一个 switch 语句。它的一些案例包含一些指针分配。

中间的语句似乎挂了编译器。编译永远不会结束。好的,我没等多久就走下大厅,和一些人交谈,喝杯咖啡然后回到我的办公桌,但这是一个通常在不到一秒钟内编译的小程序。删除一行(上面代码中指出的那一行),问题就消失了,就像删除优化时一样(在整个程序上或在函数上使用#pragma)。

为什么这条中间线会引起问题?编译器优化器不喜欢 pty。程序中的向量 ptx、pty 和 ptz 没有区别。我对 pty 所做的一切都是对 ptx 和 ptz 所做的。我尝试在 ppt 中交换他们的位置,但 pty 仍然是导致问题的行。

我问这个是因为我很好奇正在发生的事情。代码被重写并且工作正常。

编辑: 大约两周后,我检查了与我上面描述的代码最接近的版本,我无法将其重新编辑以使其崩溃。这真的很烦人,尴尬和恼火。我会再试一次,但如果我不能很快打破它,我想这部分问题已经过时了,我会删除它。真的很抱歉耽误了您的时间。

0 投票
4 回答
577 浏览

c++ - C++ 会自动将 const int 转换为浮点数吗?

我知道将整数转换为浮点数(反之亦然)相当昂贵。但是,编译器是否会在编译时自动为代码中的常量执行此操作?例如,两者之间有什么区别吗?

我看到一些执行后者的代码,但我不确定它是出于优化还是安全问题(即,即使 y 恰好是 int,也要确保除法是浮点数)。

我正在使用 gcc(因为答案可能是特定于编译器的。)

此外,任何指向编译器通常可以优化和不能优化的列表的指针都会受到赞赏。谢谢!

0 投票
1 回答
378 浏览

g++ - 不同g++版本生成的代码基准

我在一个对性能非常敏感的应用程序域的运行时系统上工作。我们付出了很多努力来保持与旧编译器版本的向后兼容性,包括避免最近实现的语言结构,并为旧版本综合它们。

但是,我担心这项工作会对我们的用户造成伤害,因为它使他们能够继续使用编译器版本,这会导致他们大量的性能损失。不幸的是,我无法找到跨版本执行性能的任何真实比较。如果有人有关于此问题的报告的链接,请发布它们。

我真的很想看到涵盖广泛版本的基准测试(如果你能回到 3.2,那就太棒了)和应用程序/测试

0 投票
2 回答
476 浏览

compiler-optimization - MS VS-2005 编译器优化未删除未使用/未执行的代码

我有一个使用 MS-Visual Studio 2005 和所有 C 代码构建的工作区。在其中我看到许多未调用但它们仍被编译的函数(它们不在任何编译时宏下以禁用它们编译)。

我为 MS-VS2005 项目设置了以下优化设置以删除未使用的代码:-

优化级别 - /Ox

启用整个程序优化 - /GL

我尝试了 Favor speed /Ot 和 Favor Size /Os

尽管有所有这些选项,当我看到链接器生成的映射文件时,我看到了映射文件中存在的符号(unsed 函数)名称。

我错过了什么吗?我想完全删除未使用的代码。

我该怎么做呢?

0 投票
4 回答
212 浏览

optimization - 为一种向前看的语言和多个文件编写编译器?

在我的语言中,当定义出现在方法下方时,我可以在方法中使用类变量。它还可以调用我的方法等下面的方法。没有“标题”。以这个 C# 示例为例。

我应该如何编译它?我在想的是:

  • pass1:将所有内容转换为 AST
  • pass2:遍历所有类并构建定义类/变量/等的列表
  • pass3:检查代码并检查是否存在未定义变量、错误使用等错误并创建我的输出

但似乎要让它工作,我必须在做 pass3 之前为所有文件做 pass 1 和 2。在我发现语法错误之前感觉还有很多工作要做(除了可以在解析时完成的明显操作,例如忘记关闭大括号或写入 0xLETTERS 而不是十六进制值)。我的直觉说还有其他方法。

注意:我正在使用 bison/flex 来生成我的编译器。

0 投票
4 回答
507 浏览

optimization - 现代优化编译器如何确定何时优化?

现代优化编译器如何确定何时应用某些优化,例如循环展开和代码内联?

由于这两者都会影响缓存,因此使用少于 X 行的天真内联函数或任何其他简单的启发式方法可能会生成性能更差的代码。那么,现代编译器是如何处理这个问题的呢?

我很难找到这方面的信息(尤其是相当容易理解的信息..),我能找到的最好的是维基百科文章。非常感谢任何细节,书籍/文章/论文的链接!

编辑:由于答案主要是关于我提到的两个优化(内联和循环展开),我只是想澄清一下我对所有和任何编译器优化感兴趣,而不仅仅是这两个。我也对可以在提前编译期间执行的优化更感兴趣,尽管 JIT 优化也很有趣(尽管程度略低)。

谢谢!

0 投票
2 回答
275 浏览

compiler-construction - 代码的重新排序和交错

在代码编译、优化和执行方面,重新排序和交错的术语是否可以互换?

0 投票
4 回答
1200 浏览

c++ - 我的 C++ 编译器是否优化了我的代码?

在使用现代 C++ 编译器(包括 MSVC、GCC、ICC)时,我怎么能说它是否具有:

  1. 并行化代码
  2. 向量化循环(或使用其他特定的处理器指令)
  3. 展开循环
  4. 检测到尾递归
  5. 执行 RVO(返回值优化)
  6. 或以其他方式优化

无需深入研究编译器生成的汇编代码?

0 投票
3 回答
4789 浏览

compiler-construction - 你最喜欢的抽象语法树优化

如果您正在构建一个编译器,那么 AST 级别的哪种优化是最好的?