【问题标题】:Performance differences between transpiled ES2017 and compiled TypeScript?转译的 ES2017 和编译的 TypeScript 之间的性能差异?
【发布时间】:2017-11-08 13:47:31
【问题描述】:

我问自己,转译后的 ES2017+ 和编译后的 TypeScript 是否在某一点上出现任何性能差异?

这个想法冒出来了,但考虑到生成的 JS,这是完全不同的(不过 TypeScript 的 JS 似乎更简单)。

ES2017 代码

class TestClass {
  constructor(valueA) {
    this.valueA = valueA;
  }

  getValueA() {
   return this.valueA; 
  }
}

变成

"use strict";

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var TestClass = function () {
  function TestClass(valueA) {
    _classCallCheck(this, TestClass);

    this.valueA = valueA;
  }

  _createClass(TestClass, [{
    key: "getValueA",
    value: function getValueA() {
      return this.valueA;
    }
  }]);

  return TestClass;
}();

TypeScript 代码

class TestClass {
  valueA: any;
  constructor(valueA) {
    this.valueA = valueA;
  }

  getValueA() {
   return this.valueA; 
  }
}

变成

var TestClass = /** @class */ (function () {
    function TestClass(valueA) {
        this.valueA = valueA;
    }
    TestClass.prototype.getValueA = function () {
        return this.valueA;
    };
    return TestClass;
}());

【问题讨论】:

  • 请注意,您的 ES2017 示例中没有特定于 ES2017 的代码;它仅使用 ES2015 和更早的构造。
  • 正确。但这不是重点。

标签: javascript typescript babeljs


【解决方案1】:

当然,您引用的两个输出之间存在性能差异,尽管这些性能差异不太重要。 Babel 的输出使用了几个函数调用,检查各种东西等。TypeScript 的输出没有。

值得注意的是,原因 Babel 所做的就是尽最大努力确保其输出的代码的正确性。 ES2015 的 class 需要检查,例如要求通过 newsuper 调用构造函数; TypeScript 的转译代码不这样做。

Babel 的某些转换具有“松散”模式,可让它们输出技术上不正确的代码,但会产生更快的代码,并且在大多数情况下,最终结果与正确代码的结果相同。例如,如果您在该代码上使用es2015-loose 而不是es2015you get this(我已经做了一些自动换行):

"use strict";

function _classCallCheck(instance, Constructor) {
    if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
    }
}

var TestClass = function () {
  function TestClass(valueA) {
    _classCallCheck(this, TestClass);

    this.valueA = valueA;
  }

  TestClass.prototype.getValueA = function getValueA() {
    return this.valueA;
  };

  return TestClass;
}();

...这更类似于 TypeScript 输出。

【讨论】:

  • 好的,谢谢。一件事:当它也被转译时,为什么文档定义“编译器选项”typescriptlang.org/docs/handbook/compiler-options.html?我对“转译”的理解是:将一种语言的一种版本带到另一种(旧的),而“编译”是:将一种语言翻译成另一种语言(在这种情况下是 TS 到 JS)
  • @scipper:嘿,正如你评论的那样,我删除了那个括号,因为它太不相关了。 :-) 他们称tsc 为编译器。这只是语义。 tsc 和 Babel 做同样的基本事情:它们接受语言 X 并输出语言 Y。你称之为编译还是编译很大程度上取决于你。我认为术语转译更准确,因为对我来说“编译”是将语言 X 源代码转换为机器代码或至少是中间二进制字节码形式(a'la Java 和 .Net),tsc 不这样做.
  • 嗯好的。我可以忍受这个;)
  • +1 用于提及松散模式。 makes it 看起来更像 TypeScript 输出。
猜你喜欢
  • 2012-02-11
  • 2020-10-16
  • 2019-04-30
  • 2017-06-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 2013-02-24
相关资源
最近更新 更多