【问题标题】:Web Assembly (Wasm), garbage collectionWeb Assembly (Wasm),垃圾回收
【发布时间】:2019-03-03 17:51:33
【问题描述】:

我听说 Webassembly 将成为静态类型语言的编译目标,并且可以在浏览器中运行。声称它可以(接近)本机速度在浏览器中运行。这是因为 Wasm 与相应机器的机器指令比较接近。

但是有两种类型的语言可以编译成 Wasm:

  1. 带有垃圾收集功能的语言,例如Java、C#
  2. 没有垃圾收集的语言,例如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


【解决方案1】:

GC 提案旨在严格按使用量付费。也就是说,不使用相关指令的程序不应该受到任何影响。

另一种思考方式,至少就 Wasm 的当前浏览器实现而言,GC 提议只是为您提供了一种访问 JavaScript 值所在的同一个堆的方法。无论该堆是否存在Wasm 使用它,不使用时,与当前情况没有区别。

【讨论】:

  • 感谢您的回答!你的意思是即用即付,例如C++ 程序不使用 GC,因此不必为伴随它的指令付出代价? (而例如 Java 编译的 WASM 程序确实有 GC 指令,并且必须用 CPU 周期来支付)
  • @WillemvanderVeen,是的。在第一个近似值中,真正花费您关于 GC 的唯一一件事就是执行它。如果你不分配任何东西,你就永远不会运行它。
猜你喜欢
  • 2011-12-21
  • 2012-01-28
  • 2013-06-27
  • 2011-11-29
  • 2021-12-20
  • 2011-07-15
  • 2014-03-09
  • 2013-06-10
  • 2010-11-05
相关资源
最近更新 更多