问题标签 [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.
delphi - Delphi 编译器是否执行优化?
我正在使用 Delphi 7 IDE。Delphi 编译器是否优化代码,就像 C++ 编译器在以下链接中所做的那样?
http://msdn.microsoft.com/en-us/library/aa366877(VS.85).aspx
如果ZeroMemory
在此示例中调用而不是SecureZeroMemory
,编译器可以优化调用,因为szPassword
缓冲区在超出范围之前不会被读取。密码将保留在应用程序堆栈中,在那里它可以在故障转储中捕获或被恶意应用程序探测。
c# - 何时通过代码优化“内联”属性
这是一个菜鸟问题。我有一个简单的财产
我从类(和派生类)中的其他属性和方法多次调用
我喜欢保持这样,因为它使代码可读(对我来说),但我担心所有IsRoot
调用都会减慢我的速度,因为它们可能不会在最终版本代码中“内联”。我所说的“内联”是指它们被parent==null
评估的副本代替get_IsRoot()
.
有人可以向我解释何时(或是否)在 C# 中内联属性,并且对于面向性能的应用程序是否应避免使用属性?
EDIT_1:简短的回答是:属性转换为纯函数调用,它们可能会或可能不会被内联,具体取决于 JIT 的决定。相信系统会做出正确的选择,不要担心可能会影响 5%-10% 级别的事情,除非使用分析器并且最终结果针对性能进行了微调。
感谢 SO 社区的链接,我希望有办法奖励多个正确答案。对不起,我不得不选择一个。
java - 如何诱导或帮助 Java 编译器优化代码?
我想知道 Java 编译器的哪些优化通常会因为不清晰或编写错误的代码而被阻止(或未被检测到),以及会犯什么样的常见错误来混淆编译器的代码
c++ - 提示编译器帮助它完成优化任务
'Surviving the Release Version' 文章中的const 和 volatile章节让我想到编译器可以使用const关键字作为其优化工作的提示。
您是否知道编译器的其他一些优化提示或函数的设计原则,以便编译器可以将它们内联?
顺便说一句,您是否将原始类型函数参数声明为 const 或 const 引用(如void foo(const int i)
或void foo(const int& i)
)?
谢谢!
c++ - 在 C/C++ 中使用汇编语言
我记得在某处读过,为了真正优化和加速代码的某些部分,程序员用汇编语言编写该部分。我的问题是——
- 这种做法还在做吗?以及如何做到这一点?
- 用汇编语言编写是不是有点太麻烦和过时了?
- 当我们编译 C 代码(带或不带 -O3 标志)时,编译器会进行一些代码优化并链接所有库并将代码转换为二进制目标文件。因此,当我们运行程序时,它已经是最基本的形式,即二进制。那么引入“汇编语言”有什么帮助呢?
我正在尝试理解这个概念,非常感谢任何帮助或链接。
更新:根据 dbemerlin 的要求改写第 3 点 - 因为您可能能够编写比编译器生成的更有效的汇编代码,但除非您是汇编专家,否则您的代码可能会运行得更慢,因为编译器通常会比大多数人更好地优化代码.
wolfram-mathematica - Mathematica:使用简化来做常见的子表达式消除和强度降低
所以最近我一直在玩弄 Mathematica 的模式匹配和术语重写如何在编译器优化中得到很好的利用……试图高度优化作为循环内部部分的短代码块。减少计算表达式所需工作量的两种常见方法是识别多次出现的子表达式并存储结果,然后在后续点使用存储的结果来节省工作。另一种方法是尽可能使用更便宜的操作。例如,我的理解是求平方根比加法和乘法需要更多的时钟周期。需要明确的是,我对评估表达式所需的浮点运算成本感兴趣,而不是 Mathematica 评估它需要多长时间。
我的第一个想法是我会使用 Mathematica 的简化函数来解决开发问题。可以指定一个复杂度函数来比较两个表达式的相对简单性。我打算为相关的算术运算使用权重创建一个,并将 LeafCount 添加到表达式中,以说明所需的分配操作。这解决了强度方面的减少问题,但让我绊倒的是消除了常见的子表达式。
我正在考虑将公共子表达式消除添加到简化使用的可能转换函数中。但是对于一个大表达式,可能有许多可能的子表达式可以被替换,并且在你看到表达式之前不可能知道它们是什么。我编写了一个提供可能替换的函数,但您指定的转换函数似乎只需要返回一个可能的转换,至少来自文档中的示例。关于如何绕过这个限制的任何想法?有没有人更好地了解简化如何使用可能暗示前进方向的转换函数?
我想,在幕后 Simplify 正在做一些动态编程,尝试对表达式的不同部分进行不同的简化,并返回复杂度分数最低的那个。我是否会更好地尝试使用常见的代数简化(例如因子和收集)自己进行这种动态编程?
编辑:我添加了生成可能要删除的子表达式的代码
从 CommonSubExpressions 返回的列表中选择一个公共子表达式后,执行替换的函数如下所示。
冒着这个问题变长的风险,我会放一些示例代码。我认为尝试优化的体面表达式是用于求解微分方程的经典Runge-Kutta方法。
最后,判断不同表达式的相对成本的代码如下。在这一点上,权重是概念性的,因为这仍然是我正在研究的一个领域。
scheme - 如何判断我的尾递归 Scheme 函数是否被正确优化
我有一个 Scheme 函数,其基本形式如下所示
我觉得这很明显需要针对编译中的迭代进行优化,但是当我编译它(用鸡)时,它仍然运行得非常慢。(如果我了解 R5RS 规格:http ://groups.csail.mit.edu/mac/ftpdir/scheme-reports/r5rs-html.old/r5rs_22.html ,这看起来应该可以)
我在 python 中使用 while 循环编写了完全相同的算法,解释程序在几秒钟内终止。我编译的方案大约需要 15 分钟,我很肯定算法是相同的。
我认为这是一个没有得到优化的尾递归问题,因为我想不出还有什么可能,但我想不通。有任何想法吗?就其价值而言,var 是一个散列,破坏性更新只是添加一个元素,尽管它还返回要作为 newvar 传入的更新后的散列。
c - C 编译器可以在调用周围预取数据吗?
是否有可能启用高度优化的良好 C 编译器来优化带有预取的代码并在某些函数调用之前放置预取:
因此,可以在编译器优化后进行编码以对abc
字段进行预取并将其移动到高于function_first()
调用的位置,如下所示:
该函数function_first()
可以注释为clean
(对字段1以外的abc字段没有副作用),或者程序可以在整个程序优化中编译(-ipo /Qipo for intel),编译器可以检查,function_first
做什么。
更新:没有调用预取是可能的,但这个问题是关于混合调用和预取
谢谢。
c - C“内联”关键字的替代品
从我的课程导师那里,他一再强调并要求我们不要对函数使用“内联”关键字。他说它在编译器之间不是“可移植的”,也不是“标准的”。考虑到这一点,是否有任何允许“内联扩展”的“标准”替代方案?
c++ - 程序员何时使用空基优化 (EBO)
我正在阅读有关空基优化(EBO)的信息。在阅读的过程中,我的脑海中突然出现了以下问题:
当 Empty 类对派生类没有任何贡献时(既不是功能方面的,也不是数据方面的),使用 Empty 类作为基类有什么意义?
在这篇文章中,我读到:
//S 为空
类 struct T : S
{
int x;
};[...]
请注意,我们没有丢失任何数据或代码准确性:当您创建类型 S 的独立对象时,对象的大小仍然像以前一样为 1(或更大);只有当 S 被用作另一个类的基类时,它的内存占用才会缩小到零。为了实现这种节省的影响,想象一个包含 125,000 个对象的向量。仅 EBO 就节省了半兆内存!
这是否意味着如果我们不使用“S”作为“T”的基类,我们必然会消耗双倍兆字节的内存?我认为,这篇文章比较了两种我认为不正确的不同场景。
我想知道一个真实的场景,当 EBO 被证明是有用的时。(意味着,在同样的场景中,如果我们不使用 EBO,我们必然会不知所措!)。
请注意,如果您的答案包含这样的解释:
关键是一个空类的大小不为零,但是当派生或派生它时,它的大小可以为零,那么我不是在问这个,因为我已经知道了。我的问题是,为什么有人首先会从一个空类中派生出他的类?即使他没有派生并且只是编写他的类(没有任何空基),他是否以任何方式不知所措?