【发布时间】:2019-03-03 17:51:33
【问题描述】:
我听说 Webassembly 将成为静态类型语言的编译目标,并且可以在浏览器中运行。声称它可以(接近)本机速度在浏览器中运行。这是因为 Wasm 与相应机器的机器指令比较接近。
但是有两种类型的语言可以编译成 Wasm:
- 带有垃圾收集功能的语言,例如Java、C#
- 没有垃圾收集的语言,例如C/C++、锈
我目前的理解是垃圾回收是一个对性能产生负面影响的过程,因为它需要 CPU 周期。
问题:
如果 Wasm 程序是用一种具有垃圾收集功能的语言与一种没有垃圾收集功能的语言编写的,性能会不会有所不同?
【问题讨论】:
-
人们不得不假设,如果可以编译为 Java、C#、C/C++ 和 Rust 等实际机器代码的语言存在性能差异,那么当 WASM 是在编译成实际机器码时用作中间体。
-
或者换一种说法,如果 Wasm 有什么神奇的方法可以让那些垃圾回收 CPU 周期消失,那么 Java 和 C# 等语言已经在使用它了。
-
请记住,C++ 中没有任何东西阻止您使用垃圾收集库... Java 和 C++ 之间的区别在于,JVM 对您强制执行 GC,而在 C++ 中您可以按照自己的方式实现它希望(即编写自己的机制或使用一些库)。从机器代码的角度来看,没有区别,GC 代码要么作为 JVM 的一部分运行,要么作为应用程序本身的一部分运行,CPU 不关心这些细微之处,它只执行指令本身。因此,您的问题归结为“运行更多指令是否会花费更多周期?” =“是”。
-
@Ped7g,这是不正确的。在没有编译器和运行时系统支持的情况下,您通常可以实现的唯一 GC 形式是保守 GC,它的性能特征通常比精确 GC(在空间和时间上)要差得多,而且不能执行多次代、增量或压缩。
-
@Ped7g,在具有内置 GC 的运行时中,该 GC 不会在其自己的对象实现上运行,而是在实现的主题上运行。该主题通常是一种具有比 C++ 更强的不变量的语言。即使两者使用相同的语言,这两个实例也会在完全不同的宇宙中运行(除非您的实现是元循环的)。我不会评论内存管理“非常容易”的说法,除了说它对于生命周期没有严格嵌套的任何用例都是错误的。一旦您需要大量引用计数,GC 通常会更有效。
标签: performance assembly garbage-collection webassembly