Javascript子字符串是虚拟的吗?
如果我们有一个巨大的字符串,名为Javascript子字符串是虚拟的吗?,javascript,string,substring,v8,spidermonkey,Javascript,String,Substring,V8,Spidermonkey,如果我们有一个巨大的字符串,名为str1,比如500万个字符长,然后str2=str1.substr(5555100),那么str2的长度为100个字符,是从5555(或任何其他随机选择的位置)开始的str1的子字符串 JavaScript如何在内部存储str2?字符串内容是否已复制,或者新字符串是虚拟的,并且只存储对原始字符串的引用以及位置和大小的值 我知道这取决于实现,ECMAScript标准(可能)并没有定义字符串实现背后的内容。但我想从一些熟悉V8或SpiderMonkey的专家那里了解
str1
,比如500万个字符长,然后str2=str1.substr(5555100)
,那么str2
的长度为100个字符,是从5555(或任何其他随机选择的位置)开始的str1
的子字符串
JavaScript如何在内部存储str2?字符串内容是否已复制,或者新字符串是虚拟的,并且只存储对原始字符串的引用以及位置和大小的值
我知道这取决于实现,ECMAScript标准(可能)并没有定义字符串实现背后的内容。但我想从一些熟悉V8或SpiderMonkey的专家那里了解一些情况,以澄清这一点
谢谢字符串是,对它们的任何操作都会创建新字符串
str2
是一个全新的字符串,包含从str1
复制的数据 字符串是,对它们的任何操作都会创建新字符串str2
是一个全新的字符串,包含从str1
复制的数据 AFAIK V8有四种字符串表示形式:
这可以提高实际速度,但有时这是不可取的,因为它会导致小字符串保留在较大父字符串的内存中()AFAIK V8有四种字符串表示形式:
这可以提高实际速度,但有时这是不可取的,因为它会导致小字符串保留在较大父字符串的内存中()我的这篇老博文解释了这一点,以及其他一些字符串表示形式:
搜索“依赖字符串”。我想我知道你可能在问什么:它们有时可能是有问题的东西,因为如果没有对原始的引用,你可以保留一个巨大的字符串,以便保留一个实际上在语义上可以访问的小的子字符串。实现可以做一些事情来缓解这个问题,比如在GC生成的基础上记录信息,查看是否存在这种依赖于一个字符串的实体,并将它们折叠到最小大小,但据我所知,没有这样做。(基本上,通过这种方法,您正在GC扫描时恢复
运行时\u refcount==1
样式信息。)我的这篇老博文解释了这一点,以及其他一些字符串表示形式:
搜索“依赖字符串”。我想我知道你可能在问什么:它们有时可能是有问题的东西,因为如果没有对原始的引用,你可以保留一个巨大的字符串,以便保留一个实际上在语义上可以访问的小的子字符串。实现可以做一些事情来缓解这个问题,比如在GC生成的基础上记录信息,查看是否存在这种依赖于一个字符串的实体,并将它们折叠到最小大小,但据我所知,没有这样做。(基本上,使用这种方法,您在GC扫描时恢复
运行时\u refcount==1
样式信息。)由于切片部分也是不可变的,但是,您不需要复制数据,因为用户无法尝试更改它。此外,即使在可变字符串的情况下,理论上也可以采用写时拷贝的方法,将实际拷贝延迟到更改完成的时间(以及如果更改完成)。但是,由于切片部分也是不可变的,您不需要复制数据,因为用户无法尝试更改它。此外,即使在可变字符串的情况下,理论上也可以采用写时拷贝的方法,将实际拷贝延迟到更改完成的时间(以及是否完成)。