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

10
我们有一个C#的Winforms应用程序,用大量对象实例、float[]数组和对象引用来模拟3D地球和世界状态,并表示对象之间的关系。
我们被要求将这个软件迁移到网络上,并使用Javascript重新实现它。
我知道C#会被编译成本地代码,但近年来Javascript的性能也有了巨大的进步。
我想知道是否有任何关于Javascript在原始数据操作方面(包括对象和数组)的性能和内存方面的一般信息或与.NET或其他本地执行语言进行比较的内容?

JavaScript已经变得非常快了,最大的问题不在于语言本身,而在于人们如何编写他们的应用程序。 最近我听了一场谈话,一位谷歌工程师解释说,他们有时候使用JS来实现JS功能,因为在某些情况下它们比C ++更快。https://www.youtube.com/watch?v=UJPdhx5zTaw通过Google搜索JS vs本机性能,您将获得大量信息。这个库可能对手头的任务有用:https://github.com/mbostock/d3/wiki/Gallery我知道您正在寻找C#比较,但我认为您可能会发现这些信息同样有用。 - Ron Sims II
存在一篇关于编译型与解释型语言的博士论文,理论上解释型语言更快。这篇论文是由加州某所学校的一位学生撰写的,但很遗憾,在我阅读完论文后没有保存参考文献。至于 C++ vs C# 和 JavaScript 的区别,它们都是解释型语言,其中一个是来自 IL,另一个是来自文本/脚本。 - Mark Schultheiss
1个回答

14

简短回答

如果你是一名熟练的C#开发人员和初学者JavaScript开发人员,那么你的C#肯定会更快。如果你两者都熟练掌握,那么你的C#可能会更快,但差别可能没有你想象的那么大 - 这完全取决于具体的程序。

较长回答

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

除了其他因素等同于(且非微不足道),.NET代码 - JITed或非JITed - 将比在浏览器中运行的类似JavaScript代码表现得更好。性能差异的程度高度具体化到特定的程序。从正在处理的对象的大小和数量到如何以及何时使用循环 - 所有这些都会影响一个运行时与另一个运行时之间的比较。

更多细节

开发人员有时会对哪种语言是解释的还是编译的感到困惑,许多人认为这两者是互斥的。实际上,情况要复杂一些。

  • 例如,C#被编译(成为IL字节码)。然后解释该IL字节码(并通常由特定的.NET运行时JIT编译)。
  • C#包含功能,例如dynamicReflection.Emit(),使得C#更像脚本语言,同时还“规避”了编译器和它所提供的一些性能好处。
  • JavaScript是解释性语言,但是JavaScript引擎完全可以自由地根据需要进行JIT编译。请参考这篇Firefox的博客文章,他们在其中描述了他们如何使用两阶段JIT方法。

在“现实世界”中(非平凡代码、标准编译器和标准设置),编译后的代码将比等效的“纯”解释代码运行得更快。然而,现在的解释代码通常通过JIT编译器运行-这有可能比预编译代码更快(因为JITter可以调整编译以利用特定的指令集,例如)。C#和Java等语言通过将其编译为字节码,然后在执行期间通过JITer来运行,从而利用了编译和“解释-JIT-编译”的优势。

JavaScript面对的性能障碍与编译无关,而是与语言的某些方面以及它的使用方式有关。再次看一下Firefox上的博客文章,您会看到基线编译器如何跟踪类型信息的变化(这比之前的模型丢弃相关的JIT指令要好)。

综上所述,良好编写的JavaScript在现代浏览器上会运行得非常快。它仍然会遭受初次JIT传递的性能损失(相当于在“真正”的JIT之前编译为字节码),但引擎被编写成尽可能将其最小化。


关键在于,在这种情况下,几乎不可能达到“其他一切相等”的状态。 - Mark Schultheiss
1
@MarkSchultheiss - 您绝对正确,两个环境的性质使得很难或不可能以苹果对苹果的方式进行比较。尽管如此,在任一语言中构建被认为是“类似”的程序并在其自身上下文中比较性能是可能的。在这种方法的非平凡示例下,我建议您会发现C#几乎总是更快的 - 但程度取决于程序本身的许多方面。 - Ethan Cabiac
Ethan,感谢你详细的回答。听起来在特定情况下了解的唯一方法是原型编码并进行比较。 - Brendan Hill
JIT编译器 - 具有比预编译代码更快的可能性(因为JIT编译器可以定制编译以利用特定指令集)。那么呢?编译后的代码甚至更有机会利用增强的指令集。 - Big Temp
JavaScript 在大多数现代运行时中是一种编译语言。 - Ben Aston

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