Javascript字符串大小限制:256 MB对我来说 - 对所有浏览器都一样吗? [英] Javascript string size limit: 256 MB for me - is it the same for all browsers?

查看:178
本文介绍了Javascript字符串大小限制:256 MB对我来说 - 对所有浏览器都一样吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

好奇我在Javascript中可以获得的最大字符串长度是什么,我今天在我的Firefox 43.0.1上测试了它,在Windows 7中运行。我能够构建一个长度 2 ^ 28 - 1 ,但当我尝试创建一个包含更多字符的字符串时,



Chrome47





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



  var real_console_log = console.log; console.log = function(x){real_console_log 。适用(控制台,参数); 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);返回2 * halfi< X ? half + half +'a':half + half;} function test(x){try {return alloc(x); } catch(e){return null;函数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;返回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('尝试读取第一个字符'); console.log(window.LONGEST_STRING.charAt(0)); console.log('尝试读取最后一个字符');控制台.log(window.LONGEST_STRING.charAt(maxStrLen  -  1)); console.log('试读长度'); console.log(window.LONGEST_STRING.length);  


Curious about what was the maximum string length I could get in Javascript, I tested it myself, today, on my Firefox 43.0.1, running in Windows 7. I was able to construct a string with length 2^28 - 1, but when I tried to create a string with one more char, Firebug showed me the "allocation size overflow" error, meaning the string must be less than 256 MB.

Is this the same thing for all browsers, all computers, all operational systems, or it depends?

I created the following snippet to find out the limit:

(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);
    }
})();

If you are running a different browser/OS, I would like to see your results. My result was The maximum string length is 268435455.

P.S.: I searched around for an answer, but the most recent topic I found was from 2011, so I am looking for a more up-to-date information.

解决方案

Characters are stored on 16 bits

When you see that 256*2**20 characters are in a string, that does not mean that 256 megabytes of memory is allocated. JavaScript stores every character on two bytes (as it is utf16 encoded by the specification).

A word about ropes

Todays browsers (even IE) store strings in an advanced way, most often using a rope datastructure.

  • Ropes do not need a coherent memory region to be allocated
  • Can even deduplicate substrings, that means s+s does not necessarily use twice the memory as s
  • Concatenation is very fast
  • Element access is a bit slower

By examining some runs in IE and Chrome, I would say that both of them use some lazy evaluation for strings, and will try to expand them occasionally. After running the following snippet, none of the browsers used more memory than before. But if I tried to manipulate the stored window.LONGEST_STRING in the console, IE throw an out of memory error, and chrome froze for a short time, and consumed a lot of memory (>2 GB).

ps: On my laptop IE11 had a maximum string size of 4 GB, Chrome had 512 MB

Browser behaviour

IE11

Chrome47

A faster algorithm to determine max string size

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对我来说 - 对所有浏览器都一样吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆