【发布时间】:2019-03-11 21:05:54
【问题描述】:
在其他语言的编译器领域,类似这样的东西在编译时会被优化以退出循环,因此不会每次都创建新对象:
const arr = [1, 2, 3, 4, 5]
arr.map(num => {
const one_time = 5; // this never changes, can be lifted out of the loop.
return num * one_time;
})
我试图查看 typescript 编译器是否更改了上面的代码,但似乎没有 - 也许其他东西会处理它?或者,对象创建可能会分配该变量并且永远不会更改它。
我不指望 ES2015 会这样做,因为它是被解释的,但我很高兴错了。
如果有人能告诉我将来如何最好地为自己解决这个问题,那就加分。
谢谢大家!
【问题讨论】:
-
在我知道的任何优化编译器中,在这个例子中,常量将内联到乘法表达式中,而不是变量声明被提升出循环:-)
-
"我不希望 ES2015 这样做,因为它是解释的" - 是什么让你认为 JS 是解释的?所有当代引擎都使用 JIT 优化编译器。 (对于您的示例,可能会发现对于超过 5 个项目的循环,任何优化都比仅仅解释它的成本更高)。
-
完全公平的Bergi,在这种情况下,我并不是要说明恒定长度数组,但这意味着我举了一个不好的例子!很好的一点!
-
我也没有意识到任何代码都使用解释器进行了优化,我也没有意识到使用了任何类型的引擎。你能指点我一些资源吗?我有兴趣了解它
-
第一次概述:en.wikipedia.org/wiki/JavaScript_engine。其中许多都有一些工程博客,他们在其中讨论了已实施的优化。
标签: typescript optimization ecmascript-6