javascript - 分配一个新的字符串值会产生需要收集的垃圾吗?

标签 javascript performance garbage-collection

考虑这个 javascript 代码:

var s = "Some string";
s = "More string";

垃圾收集器 (GC) 在这种操作之后是否还有工作要做?

(我想知道在尝试最小化 GC 暂停时是否应该担心分配字符串文字。)

e: 让我觉得有点好笑的是,虽然我在问题中明确指出我需要尽量减少 GC,但每个人都认为我错了。如果真的必须知道特定的细节:我有一个 javascript 游戏——它在 Chrome 中运行良好,但在 Firefox 中有半频繁的暂停,这似乎是由于 GC。 (我什至检查过 Firefox 的 MemChaser 扩展,暂停与垃圾收集完全一致。)

最佳答案

是的,字符串需要进行垃圾回收,就像任何其他类型的动态分配对象一样。是的,这是一个合理的担忧,因为在繁忙的循环中粗心地分配对象肯定会导致性能问题。

但是,字符串值是不可变的(不可更改的),大多数现代 JavaScript 实现都使用“字符串驻留”,即它们只存储每个唯一字符串值的一个实例。这意味着如果你有这样的东西......

 var s1 = "abc",
     s2 = "abc";

...只会分配一个“abc”实例。这仅适用于字符串值,不适用于 String 对象。

有几点需要注意:

  1. substringslice 等函数将为每个函数调用分配一个新对象(如果使用不同的参数调用)。

  2. 即使两个变量都指向内存中的相同数据,但在 GC 循环运行时仍有两个变量需要处理。拥有太多局部变量也会对您造成伤害,因为它们中的每一个都需要由 GC 处理,从而增加开销。

一些关于编写高性能 JavaScript 的进一步阅读:

关于javascript - 分配一个新的字符串值会产生需要收集的垃圾吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13617005/

相关文章:

java - 快速排序比 Java 中的插入排序和选择排序慢多少?

javascript - Node 没有正确地 gc 我的对象

testing - 去基准和 gc : B/op alloc/op

javascript - 是否可以强制 jQuery.jScrollPane 始终显示垂直滚动条?

javascript - 在 JavaScript 中处理表单元素的有效方法

javascript - 无法将元素/组件附加到 Extjs 面板

javascript - 将数据从指令传递回 Controller

Python 速度 32 vs 64 位 Windows 问题

c++ - 在 C++ 中存储、加载和使用倒排索引的最佳方式 (~500 Mo)

c# - 如果从未调用终结器的性能惩罚