C#和Javascript之间的性能和内存差异?

时间:2016-02-17 13:01:20

标签: javascript c# performance memory-management

我们有一个C#winforms应用程序,它使用大量对象实例,float []数组和对象引用来模拟3D地球和世界状态,以表示世界状态和对象之间的关系。

我们被要求将此软件迁移到网络并在Javascript中重新实现。

据我所知,C#可以使用本机代码,但听起来好像近年来Javascript性能也取得了巨大进步。

我想知道对于.NET或其他以原生性能执行的语言,对于对象和数组的原始数据操作,是否有任何关于Javascript票价,性能和内存的一般信息或比较?

1 个答案:

答案 0 :(得分:8)

简答

如果您是熟练的C#开发人员和新手JavaScript开发人员 - 您的C#肯定会更快。如果你精通两者,那么你的C#可能会更快,但差异可能不如你想象的那么多 - 这都是特定于程序的。

更长的答案

C#JavaScript是语言,因此它们本身没有任何特定的性能特征。 C#编译为.NET IL并在虚拟机中执行,并且可以进行各种优化(例如您提到的JITing)。 JavaScript不是编译的,而是解释的 - 并且由浏览器特有的JavaScript引擎完成。每个浏览器可能有不同的方法来提高执行JavaScript的“性能” - 但性能优化通常需要权衡(例如速度和内存之间)。

在其他所有内容相同(并且非平凡)的情况下,.NET代码(JITed与否)将比在浏览器中运行的类似JavaScript代码执行得更好。性能差异的高度特定于特定程序。从处理对象的大小和数量到使用循环的方式和时间,一切都将影响一个运行时与另一个运行时的比较。

更多细节

开发人员有时会对哪些语言的解释或编译感到困惑,而且很多人都认为这两种语言是独占的。实际上情况有点复杂。

  • 例如编译C#(转换为IL字节代码)。然后解释IL Byte代码(通常由特定的.NET运行时编译JIT)。
  • C#包含dynamicReflection.Emit()等功能,这些功能使C#更像是脚本语言,同时也“绕过”编译器及其提供的一些性能优势。
  • JavaScript被解释,但JavaScript引擎完全可以自由地使用JIT。检查这个blog article about Firefox,它们描述了他们如何使用两阶段JIT方法。

在“真实世界”(非平凡代码,标准编译器和标准设置)中,编译代码将比等效的“纯”解释代码运行得更快。但是,现在解释的代码通常通过JIT编译器运行 - 它有可能比预编译的代码更快(因为JITter可以定制编译以利用特定的指令集)。诸如C#和Java之类的语言通过编译到字节代码然后在执行期间通过JITer运行来利用编译和“解释JIT编译”。

JavaScript在性能领域面临的障碍与编译无关,而是与语言的某些方面以及如何(或倾向于)使用有关。再次,如果您查看Firefox上的博客条目,您会看到基线编译器需要如何跟踪对类型信息的更改(这比完全丢弃相关JIT指令的先前模型更好)。

考虑到所有这些因素,在现代浏览器上编写良好的JavaScript将运行得非常好。它仍将受到初始JIT传递的性能损失(相当于在“真正的”JIT之前编译为字节代码),但编写引擎以尽可能地减少这种情况。