C# 和 Javascript 之间的性能和内存差异
Performance and memory differences between C# and Javascript?
我们有一个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# 包含
dynamic
和Reflection.Emit()
等功能,这些功能使 C# 能够更像脚本语言使用,同时还"绕过"编译器及其提供的一些性能优势。
JavaScript - 是解释的,但 JavaScript 引擎完全可以自由地进行 JIT,因为它认为合适。查看这篇关于 Firefox 的博客文章,其中描述了他们如何使用两阶段 JIT 方法。
在"现实世界"(非平凡代码、标准编译器和标准设置(中,编译代码将比等效的"纯"解释代码运行得更快。然而,现在解释代码通常通过JIT编译器运行 - 它有可能比预编译的代码更快(因为JITter可以定制编译以利用特定的指令集,例如(。C# 和 Java 等语言利用编译和"解释型 JIT 编译",将编译为字节代码,然后在执行期间通过 JITer 运行。
JavaScript在性能领域面临的障碍与编译无关,而是与语言的某些方面以及它如何(或倾向于(使用有关。同样,如果您查看 Firefox 上的博客文章,您会发现基线编译器需要如何跟踪类型信息的更改(这比之前完全丢弃相关 JIT 指令的模型要好(。
考虑到所有这些因素,在现代浏览器上编写良好的JavaScript将运行得非常好。它仍然会遭受初始 JIT 传递的性能影响(相当于在"真正的"JIT 之前编译为字节代码(,但编写引擎是为了尽可能减少这种情况。
- 函数参数中的数据与指定变量之间的任何性能差异
- 提高JQuery的性能
- 使用正则表达式评估电子邮件地址时出现性能问题
- React:按键的性能提升
- 在Three.js中导出网格会提高性能吗
- 在javascript中搜索项目列表的性能
- 为什么在许多浏览器中drawImage()的性能略好于createPattern()
- 测量JavaScript函数的内存使用情况、执行时间和性能
- C# 和 Javascript 之间的性能和内存差异
- JavaScript 中的性能内存管理
- 对数组使用delete和后续的.push()会影响性能/内存消耗
- 由于jquery和内存泄漏,IE性能缓慢
- jQuery,处理表单元格上的操作侦听器,处理性能和内存泄漏
- Jquery事件性能与内存使用情况
- Javascript 类、编译器性能和新 Klass() 上的内存分配
- 套接字.IO绑定-性能和内存使用
- 内存受限设备上的脚本连接性能特征
- 内存/性能问题与全屏HTML kiosk应用程序
- Javascript性能内存泄漏
- console.log过多会影响单页应用程序's/tab's的内存和性能