【发布时间】:2011-07-13 17:04:34
【问题描述】:
常见的 JavaScript 引擎,例如 V8 和 WebKit 的 JavaScriptCore,是否使用 string interning 处理 JavaScript 字符串?还是他们实际上在内存中保留了多个相同字符串的实例?
【问题讨论】:
标签: javascript programming-languages webkit v8 string-interning
常见的 JavaScript 引擎,例如 V8 和 WebKit 的 JavaScriptCore,是否使用 string interning 处理 JavaScript 字符串?还是他们实际上在内存中保留了多个相同字符串的实例?
【问题讨论】:
标签: javascript programming-languages webkit v8 string-interning
简短回答:有时是,有时不是。
我也偶然发现了同样的问题,并对其进行了一些研究。似乎通常对以相同方式生成的字符串文字进行实习(例如,始终将相同的字符串分配给同一循环中的变量),但我也能够创建一个示例,该示例导致创建了两个相同的字符串有两个不同的参考:
如您所见,每个字符串存储两次,具有不同的引用。
这是我用来生成重复字符串的代码:
const a = [];
const b = [];
for(let j =1; j<= 100;++j){
for(let i = 1; i <= 10000; ++i) a[i] = 'player 1 got 5 points from player 2' + i;
for(let i = 1; i <= 10000; ++i) b[i] = 'player 1 got 5 points from player 2' + i;
}
似乎字符串interning是针对字符串文字完成的,但不是针对连接的字符串值,但是正如您在上面看到的,每个连接的字符串只出现两次,而不是100x2 = 200次,所以仍然对连接的字符串进行了字符串实习在外循环中创建的字符串。
【讨论】:
a 和 b 的每个元素),但是 "Only reachable objects are included in snapshots." 如果您 maintain references 到较早的连接字符串,那么你do get 200 copies 的每个字符串。
http://jsperf.com/strinterning
在 Chrome 中是,在 Aurora 15 和 FF 13 中没有! 在 Firefox 中比较两个字符串比比较两个指针慢 85%。 但是在 Chrome 中它的速度是一样的,这表明它正在比较两个指针。
也许 Mozilla 的 JS 引擎团队应该检查他们的代码...
【讨论】:
是的。通常,JS 源代码中的任何文字字符串、标识符或其他常量字符串都是 intern 的。然而,实施细节(例如,究竟是什么)会有所不同,以及何时发生。
请注意,字符串值与字符串对象不同,字符串对象不会被实习,因为这从根本上来说是不正确的行为。
【讨论】: