gpt4 book ai didi

Javascript 字符串大小限制 : 256 MB for me - is it the same for all browsers?

转载 作者:IT王子 更新时间:2023-10-28 23:34:01 25 4
gpt4 key购买 nike

很好奇我可以在 Javascript 中获得的最大字符串长度是多少,我今天在我的 Firefox 43.0.1 上进行了测试,在 Windows 7 中运行。我能够构造一个长度为 2^ 的字符串28 - 1,但是当我尝试创建一个多一个字符的字符串时,Firebug显示“分配大小溢出”错误,这意味着字符串必须小于 256 MB。

这对于所有浏览器、所有计算机、所有操作系统都是一样的,还是视情况而定?

我创建了以下代码段来找出限制:

(function() {
strings = ["z"];
try {
while(true) {
strings.push(strings[strings.length - 1] + strings[strings.length - 1]);
}
} catch(err) {
var k = strings.length - 2;
while(k >= 0) {
try {
strings.push(strings[strings.length - 1] + strings[k]);
k--;
} catch(err) {}
}
console.log("The maximum string length is " + strings[strings.length - 1].length);
}
})();

如果您运行的是不同的浏览器/操作系统,我想看看您的结果。我的结果是最大字符串长度为 268435455

P.S.:我四处寻找答案,但我发现的最新主题是 2011 年的,所以我正在寻找更新的信息。

最佳答案

字符存储在 16 位中

当您看到 256*2**20 个字符在字符串中时,这并不意味着分配了 256 MB 的内存。 JavaScript 将每个字符存储在两个字节上(因为它是由规范编码的 utf16)。

关于 ropes 的一句话

今天的浏览器(甚至 IE)以高级方式存储字符串,最常见的是使用 rope datastructure .

  • 绳索不需要分配一致的内存区域
  • 甚至可以对子字符串进行去重,这意味着 s+s 不一定使用两倍于 s
  • 的内存
  • 连接速度非常快
  • 元素访问有点慢

通过检查 IE 和 Chrome 中的一些运行,我想说它们都对字符串使用了一些惰性求值,并且偶尔会尝试扩展它们。运行以下代码段后,没有一个浏览器使用比以前更多的内存。但是如果我试图在控制台中操作存储的 window.LONGEST_STRING ,IE 会抛出内存不足的错误,并且 chrome 会在短时间内卡住,并消耗大量内存(>2 GB)。

ps:在我的笔记本电脑上,IE11 的最大字符串大小为 4 GB,Chrome 为 512 MB

浏览器行为

IE11

IE11

Chrome47

Chrome47

确定最大字符串大小的更快算法

var real_console_log = console.log;
console.log = function(x) {
real_console_log.apply(console, arguments);
var d = document,b=d.body,p=d.createElement('pre');
p.style.margin = "0";
p.appendChild(d.createTextNode(''+x));
b.appendChild(p);
window.scrollTo(0, b.scrollHeight);
};


function alloc(x) {
if (x < 1) return '';
var halfi = Math.floor(x/2);
var half = alloc(halfi);
return 2*halfi < x ? half + half + 'a' : half + half;
}

function test(x) {
try {
return alloc(x);
} catch (e) {
return null;
}
}

function binsearch(predicateGreaterThan, min, max) {
while (max > min) {
var mid = Math.floor((max + min) / 2);
var val = predicateGreaterThan(mid);
if (val) {
min = mid + 1;
} else {
max = mid;
}
}
return max;
}

var maxStrLen = binsearch(test, 10, Math.pow(2, 52)) - 1;
console.log('Max string length is:');
console.log(maxStrLen + ' characters');
console.log(2*maxStrLen + ' bytes');
console.log(2*maxStrLen/1024/1024 + ' megabytes');
console.log('');
console.log('Store longest string');
window.LONGEST_STRING = alloc(maxStrLen);

console.log('Try to read first char');
console.log(window.LONGEST_STRING.charAt(0));
console.log('Try to read last char');
console.log(window.LONGEST_STRING.charAt(maxStrLen - 1));
console.log('Try to read length');
console.log(window.LONGEST_STRING.length);

关于Javascript 字符串大小限制 : 256 MB for me - is it the same for all browsers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34957890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com