【问题标题】:Do common JavaScript implementations use string interning?常见的 JavaScript 实现是否使用字符串实习?
【发布时间】:2011-07-13 17:04:34
【问题描述】:

常见的 JavaScript 引擎,例如 V8 和 WebKit 的 JavaScriptCore,是否使用 string interning 处理 JavaScript 字符串?还是他们实际上在内存中保留了多个相同字符串的实例?

【问题讨论】:

    标签: javascript programming-languages webkit v8 string-interning


    【解决方案1】:

    简短回答:有时是,有时不是。

    我也偶然发现了同样的问题,并对其进行了一些研究。似乎通常对以相同方式生成的字符串文字进行实习(例如,始终将相同的字符串分配给同一循环中的变量),但我也能够创建一个示例,该示例导致创建了两个相同的字符串有两个不同的参考:

    如您所见,每个字符串存储两次,具有不同的引用。

    这是我用来生成重复字符串的代码:

    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次,所以仍然对连接的字符串进行了字符串实习在外循环中创建的字符串。

    【讨论】:

    • 这是什么控制台?我无法让左侧的箭头出现在字符串上,或者更奇怪的是,Opera/chrome/firefox 右侧的灰色参考
    • @towc 这是来自 chrome 开发工具的内存堆快照。
    • @XCS 我认为这是不对的:“对于在外循环中创建的连接字符串,仍然有字符串实习”。您不会维护对在外部循环的早期迭代中创建的字符串的引用(每次迭代都会覆盖 ab 的每个元素),但是 "Only reachable objects are included in snapshots." 如果您 maintain references 到较早的连接字符串,那么你do get 200 copies 的每个字符串。
    • @HanSeoul-Oh 所以连接的字符串永远不会被保留?
    • @XCS 我不知道,不幸的是,这就是我在谷歌上搜索并遇到这个问题的原因! :) 我唯一确定的是,您的测试用例并未说明连接字符串被实习的情况,而是说明堆快照不包含无法访问的对象。但是,可能存在其他情况,其中连接的字符串 ,我不知道如何找到或证明它们不存在。
    【解决方案2】:

    http://jsperf.com/strinterning

    在 Chrome 中是,在 Aurora 15 和 FF 13 中没有! 在 Firefox 中比较两个字符串比比较两个指针慢 85%。 但是在 Chrome 中它的速度是一样的,这表明它正在比较两个指针。

    也许 Mozilla 的 JS 引擎团队应该检查他们的代码...

    【讨论】:

    【解决方案3】:

    是的。通常,JS 源代码中的任何文字字符串、标识符或其他常量字符串都是 intern 的。然而,实施细节(例如,究竟是什么)会有所不同,以及何时发生。

    请注意,字符串值与字符串对象不同,字符串对象不会被实习,因为这从根本上来说是不正确的行为。

    【讨论】:

    • 嗨@olliej,您的声明有来源吗?
    • @FelipeSabino 在主要引擎上工作并加入 ecmascript 委员会算数吗? ;) 更重要的是,尽管您可以在线查看 JavaScriptCore、SpiderMonkey、V8 等的源代码。
    • 当然,我可以查看任何开源代码并亲自检查,但 SO 存在的原因之一是避免这种麻烦,哈哈。这不是怀疑你的知识的问题,它只是关心帮助开发人员进行研究。看来你是一个对这个主题很了解的人,并且有更多有力的参考资料,可以帮助我更多地了解这个主题。只是举例,你说“一般字符串是被实习的”,在什么情况下他们不是?等等……
    • @FelipeSabino 实习的逻辑(至少在 JSC 中)分布在多个领域。基本模型与 Java 类似——常量字符串会被自动插入,字符串连接的结果等则不会。在 Java 中,您可以显式强制实习,但这在 JS 中不存在。
    • @olliej 你能看看这里吗?stackoverflow.com/questions/26549715/… 也在这里stackoverflow.com/questions/26532550/… 引起了激烈的争论。谢谢!非常感谢您的帮助:)
    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2016-09-11
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2013-03-10
    相关资源
    最近更新 更多