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

Bre*_*ill 7 javascript c# performance memory-management

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

我们被要求将此软件迁移到Web并在Javascript中重新实现它.

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

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

Eth*_*iac 10

简答

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

更长的答案

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

由于其他一切都是等价的(并且非平凡),.NET代码 - 无论是否JIT - 将比在浏览器中运行的类似JavaScript代码执行得更好.该学位的性能差异是高度针对特定程序.从处理对象的大小和数量到使用循环的方式和时间,一切都会影响一个运行时与另一个运行时的比较.

更多细节

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

  • 例如,编译C#(转换为IL字节代码).然后解释IL Byte代码(通常由特定的.NET运行时编译JIT).
  • C#包含诸如dynamic并且Reflection.Emit()使C#更像脚本语言的功能,同时还"绕过"编译器及其提供的一些性能优势.
  • JavaScript被解释,但JavaScript引擎完全可以自由地使用JIT.查看这篇关于Firefox的博客文章,其中描述了他们如何使用两阶段JIT方法.

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

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

考虑到所有这些因素,在现代浏览器上编写良好的JavaScript将运行得非常好.它仍然会遭受初始JIT通("真实"的JIT编译之前对字节码的等价物)的性能损失,但引擎被写入减少这种尽可能.