【问题标题】:Typescript compiler, or ES2015 - do either optimize code?Typescript 编译器或 ES2015 - 是否优化代码?
【发布时间】: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


【解决方案1】:

不,TypeScript 编译器不做任何优化。这是它的非目标之一:

非目标

  • 积极优化程序的运行时性能。相反,发出符合运行时平台性能特征的惯用 JavaScript 代码。

来源:https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals

对于 ES2015,这是一个语言规范。 JS 引擎会编译和优化。

【讨论】:

  • 谢谢大卫!很好的答案,我明白他们为什么这样做。然而,引用的第一句话有点混淆了事情,但我明白了意图。也许删除它?
  • 我为引用提供了更多上下文。我明白那是多么令人困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多