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

Performance and memory differences between C# and Javascript?

本文关键字:内存 性能 Javascript 之间      更新时间:2023-09-26

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

我们被要求将这个软件迁移到Web,并在Javascript中重新实现它。

我知道 C# 被抖动到本机代码,但听起来好像近年来 Javascript 性能也有了巨大的进步。

我想知道与 .NET 或其他以本机性能执行的语言相比,是否有任何关于 Javascript 在对象和数组的原始数据操作方面的一般信息或比较?

简答题

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

更长的答案

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

由于其他所有内容都是等效的(并且非平凡的(,.NET 代码(无论是否 JITed(将比在浏览器中运行的类似 JavaScript 代码性能更好。性能的差异程度因特定程序而异。从正在处理的对象的大小和数量到使用循环的方式和时间,一切都会影响一个运行时与另一个运行时的比较方式。

更多详情

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

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

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

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

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