TypeScript性能(asm.js,闭包编译器)和开销

20
我正在考虑在未来的项目中结合客户端MVC(很可能是 Backbone.js + Marionette.js 或 Ember.js)使用 TypeScript,并因此有一些与性能和优化相关的问题:
  • TypeScript 的输出性能如何与本地 JavaScript 相比?

  • 由于 asm.js 是 JavaScript 的一个子集,是否可能将 TypeScript 代码转换为 asm.js 代码?如果是,现在是否已经可能?

  • 是否可以并且仍然有用地创建使用 Google Closure 编译器的 AMD 项目构建,该项目使用 TypeScript?

  • TypeScript 在平均文件大小方面增加了多少开销?

  • 在例如小型项目中使用像 Backbone.js 这样的轻量级库时,使用 TypeScript 是否在文件大小方面有意义?

我喜欢 TypeScript 带来的附加优势,但我不想为编码风格和类型牺牲性能。
非常欢迎任何关于在大型项目中使用 TypeScript 的文章/书籍,特别是与性能、优化和构建相关的!
谢谢您的帮助!

你需要更多地了解TypeScript的本质。我建议你看一下TypeScript编译器的输出。你会发现它只是普通的JavaScript,没有什么花哨的东西,如果你知道如何编写良好的JavaScript(因为相同的性能规则仍然适用),那么也没有真正可测量的开销。JavaScript不能编译成asm.js。它是一个超集。因此,TypeScript也不能。 - WiredPrairie
1个回答

28
我们在团队中对TypeScript进行了彻底的评估和测试,其他团队已经在使用它,这是我的经验:

  • TypeScript是JavaScript的超集,大多数情况下都可以一对一地转换为JavaScript,没有任何重大性能妥协,因此如果您知道如何编写高效的JavaScript,那么您就知道如何编写高效的TypeScript。其中一个不太高效的特性是继承,它是使用JavaScript原型“模拟”的,并且产生的代码比通常在JavaScript中编写的代码更多。因此,请小心使用继承。您可以查看生成的JavaScript,以查看您的构造是否被编译得足够高效。
  • 将TypeScript编译为asm.js与将JavaScript编译为asm.js相同-您需要模拟asm.js缺少的功能与完整的javascript相比... 如果您需要asm.js中的某些部分,您可能需要自己编写它们或通过emscripten等编译来自一种更适合(不太动态)的语言。
  • TypeScript具有一些AMD支持,但我不能谈论Google闭包支持...由于它尝试以非常不同的方式实现类似的事情(类型和元信息在注释中而不是在新语法中),我认为它们不太兼容,不能最大限度地使用两者。
  • 文件大小不是真正的问题,它与可读JavaScript的文件大小非常相似,除非您经常使用继承
  • 与backbone和其他库一起使用TypeScript与JavaScript相比有一个好处;大多数流行的库已经为TypeScript提供了类型定义文件,因此您几乎可以免费获得自动完成和类型检查。与编写良好的JavaScript相比,文件大小差异并不是真正的问题。

TypeScript仍然很年轻,我们想要拥有的许多功能(JSLint、代码覆盖率、TDD、BDD工具等)在当时还不存在。此外,编译器中存在几个错误(后来已经修复),因此我们没有选择使用它,但您列出的任何一点都没有成为我们真正放弃使用它的原因...

更新:

要了解TypeScript的潜力,可以查看Visual Studio Online "Monaco"。他们在那里所做的非常令人印象深刻,请参阅入门TypeScript获得快速介绍。

关于继承 - 这些性能问题是由于使用反射造成的:var __extends = this.__extends || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } __.prototype = b.prototype; d.prototype = new __(); }; - Jordan
...但正如你所说,其余部分基本上是1:1,并且在我看来是原型模式和模块模式的巧妙运用,采用松散增强 - 继承使用紧密增强来支持覆盖(参考:http://www.adequatelygood.com/JavaScript-Module-Pattern-In-Depth.html) - Jordan
我不会说“性能问题”,因为反射仅在定义“类”时使用,而不是创建实例,您也不会定义那么多类(例如循环或其他方式),因此速度不会受到明显影响... - jJ'
公平地说 - Anders Hejlsberg也指出,即使不使用类,也可以利用TypeScript的优势 - 大部分JavaScript社区反对类 :) - Jordan
使用 TypeScript 确实可以提高在 V8 引擎中的性能(请参见隐藏类)。 - user93
@user93 隐藏(或隐式)类与 TypeScript 没有太多关系,它们是为了加速普通 JS 而添加的,人们在 TS 之前就从这种优化中受益了(我总是编写 JS 以启用此优化)。TS 只是使编写一致的初始化更方便,从而也实现了这一点。 - jJ'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接