Javascript 类型脚本性能(asm.js,闭包编译器)和开销

Javascript 类型脚本性能(asm.js,闭包编译器)和开销,javascript,performance,typescript,google-closure-compiler,asm.js,Javascript,Performance,Typescript,Google Closure Compiler,Asm.js,我正在考虑将TypeScript与客户端MVC(很可能是Backbone.js+Marionette.js或Ember.js)结合使用,以用于未来的项目,因此有一些与性能和优化相关的问题: TypeScript输出与本机JavaScript性能相比如何 由于asm.js是JavaScript的一个子集,是否可以将TypeScript代码转换为asm.js代码?如果是,是否已经可能 使用googleclosurecompiler创建使用TypeScript的AMD项目版本是否可能并且仍然有用 就

我正在考虑将
TypeScript
与客户端MVC(很可能是
Backbone.js
+
Marionette.js
Ember.js
)结合使用,以用于未来的项目,因此有一些与性能和优化相关的问题:

  • TypeScript
    输出与本机JavaScript性能相比如何

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

  • 使用
    googleclosurecompiler
    创建使用
    TypeScript
    的AMD项目版本是否可能并且仍然有用

  • 就文件大小而言,
    TypeScript
    平均增加了多少开销

  • 例如,在小型项目中使用轻量级库(如
    Backbone.js
    )时。在文件大小方面使用
    TypeScript
    有意义吗

我喜欢
TypeScript
的额外好处,但我不想为了编码风格和键入而牺牲性能

欢迎阅读任何关于在大型项目中使用
TypeScript
的文章/书籍,尤其是与性能、优化和构建相关的文章/书籍


提前谢谢你

我们在我们的团队中对TypeScript进行了全面的评估和测试,其他团队也已经在使用它,因此我的经验如下:

  • TypeScript是JavaScript的超集,它主要将1:1转换为JavaScript,没有任何显著的性能损失,因此如果您知道如何编写高效的JavaScript,那么您就知道如何编写高效的TypeScript。其中一个效率不高的特性是继承,它是使用JavaScript原型“模拟”的,产生的代码比通常使用JavaScript编写的代码要多。因此,谨慎使用继承。您可以查看生成的JavaScript,以查看您的构造是否能够根据您的案例高效地编译
  • 将typescript编译为asm.js与将JavaScript编译为asm.js的问题相同-您需要模拟asm.js与完整JavaScript相比所缺乏的功能。。。如果您需要asm.js中的某些部分,您可能需要自己编写它们,或者使用emscripten等更合适(不太动态)的语言进行编译
  • TypeScript有一些AMD支持,但我不能谈论谷歌关闭支持。。。由于它试图以非常不同的方式完成类似的事情(在注释中使用新的语法而不是类型和元信息),我认为它们不太兼容,无法最大限度地使用这两者
  • 文件大小不是一个真正的问题,它非常类似于可读JavaScript的文件大小,除非您经常使用继承
  • 与JavaScript相比,将TypeScript与主干和其他库一起使用有一个好处;大多数流行的库已经有了TypeScript的类型定义文件,所以您几乎可以免费获得自动完成和类型检查。与编写良好的JavaScript相比,文件大小差异并不是一个真正的问题
TypeScript还很年轻,我们想要的很多东西(JSLint、代码覆盖率、TDD、BDD工具等)当时都不见了。此外,编译器中有几个bug(后来已经修复),所以我们没有选择使用它,但您列表中的任何一点对我们来说都不是真正的拒绝

更新
要了解TypeScript的潜力,您可以查看Visual Studio Online“Monaco”。他们在那里所做的非常令人印象深刻,请参见快速介绍

您需要阅读更多有关打字脚本性质的内容。我建议您看看TypeScript编译器的输出。你会发现它只是简单的老式的香草JavaScript。如果您首先知道如何编写好的JavaScript,那么就不会有任何花哨的东西,也不会有真正可测量的开销(同样的性能规则也是如此)。无法将JavaScript编译为asm.js。这是一个超集。因此,TypeScript.re:heritation也不能——这些性能问题是由于使用反射引起的:var u扩展=this。u扩展| | | |函数(d,b){for(b中的var p)如果(b.hasOwnProperty(p))d[p]=b[p];函数u(){this.constructor=d;}u.prototype=b.prototype;d.prototype=new()};。。。但是,正如您所说的,其余的几乎是1:1,并且是IMHO巧妙地使用原型模式和模块模式w/松散扩展-继承使用紧密扩展来支持重写(仅供参考:),我不会说“性能问题”,因为反射仅在定义“类”时使用没有创建实例,也没有定义那么多的类(比如在循环中执行),因此,速度并没有受到明显的影响……这很公平——Anders Hejlsberg也指出,您甚至不必使用类来利用TypeScript——JavaScript社区的很大一部分是反类的:)使用TypeScript确实可以提高您在v8中的性能(请参阅隐藏类)