sta*_*wed 8 javascript performance garbage-collection
考虑这个javascript代码:
var s = "Some string";
s = "More string";
Run Code Online (Sandbox Code Playgroud)
在这种操作之后,垃圾收集器(GC)是否有工作要做?
(我想知道在尝试最小化GC暂停时是否应该担心分配字符串文字.)
e:我有点觉得好笑,虽然我在我的问题中明确说明我需要最小化GC,但是每个人都认为我错了.如果一个人真的必须知道具体的细节:我有一个javascript游戏 - 它在Chrome中运行良好,但在Firefox中有半频率暂停,这似乎是由于GC.(我甚至用Firefox的MemChaser扩展程序检查过,暂停与垃圾收集完全一致.)
是的,字符串需要进行垃圾收集,就像任何其他类型的动态分配对象一样.是的,这是一个有效的问题,因为在busy循环中不小心分配对象肯定会导致性能问题.
但是,字符串值是不可变的(不可更改),并且大多数现代JavaScript实现使用"字符串实习",即它们仅存储每个唯一字符串值的一个实例.这意味着如果你有这样的东西......
var s1 = "abc",
s2 = "abc";
Run Code Online (Sandbox Code Playgroud)
......只会分配一个"abc"实例.这仅适用于字符串值,而不适用于String对象.
要记住以下几点:
像substring,slice等等函数将为每个函数调用分配一个新对象(如果使用不同的参数调用).
尽管两个变量都指向内存中的相同数据,但在GC循环运行时仍有两个变量需要处理.拥有太多局部变量也会对您造成伤害,因为每个变量都需要由GC处理,从而增加了开销.
关于编写高性能JavaScript的一些进一步阅读: