сколько данных может содержать javascript в браузере? - PullRequest
10 голосов
/ 09 ноября 2011

Я создал JSFiddle, чтобы посмотреть, сколько данных я могу вставить в свой браузер.

Ссылка http://jsfiddle.net/GWxAk/

Код прост. Он просто пытается вставить как можно больше строк в массив. Строки имеют приблизительную длину 300-310 символов.

Мой вопрос: зависит ли результат от того, сколько памяти у меня на компьютере? действительно ли он отличается от браузера к браузеру?

Например, если у меня есть 8 ГБ оперативной памяти, получу ли я гораздо больше, чем если бы у меня было 4 ГБ?

var s = '';
for (var i = 0; i < 300; i++) {
    s += 'a';
}

array = [];
count = 0;

function doMore() {
    for (var i = 0; i < 1000; i++) {
        count++;
        array.push(s + count);
    }
};

function repeat() {
    doMore();
    document.body.innerHTML = 'size:' + array.length;
    setTimeout(repeat, 100);
}

repeat();

В моем случае хром висит на 14850000 и у меня 4 Гб оперативной памяти Это массив из почти 15 миллионов предметов. Не плохо, я думаю,

Вы, ребята, получаете то же самое? Может кто-нибудь подсказать, как дать браузеру как можно больше памяти

Спасибо

Ответы [ 4 ]

8 голосов
/ 09 ноября 2011

Опять моя машина с 16 ГБ ОЗУ. Я могу наблюдать, как увеличивается использование ОЗУ в браузере по мере его увеличения, поэтому я предполагаю, что оно также ограничено ОЗУ.

IE crapped out at 16,840,000
Chrome at 14,850,000
Firefox 32,890,000
Safari recycles itself around 8,720,000 (LOL @ Apple)

Вот скриншот использования памяти и Firefox http://screencast.com/t/3Xl31yGgHWC

5 голосов
/ 09 ноября 2011

Допустим, UTF8 означает, что ваше 'a' составляет 2 байта / 8 бит.

  • 14 850 000 * 300 = 4455000000 символов

  • 14850000 *300 * 2 = 8 910 000 000 байтов

  • 8910000000/1024 = 8 701 171,875 КБ
  • (8910000000/1024) / 1024 = 8 497,238159179688 МБ
  • ((8910000000/1024) /1024) / 1024 = 8.298084139823914 ГБ

Таким образом, из вашего теста можно предположить, что максимальная длина строки в движке Chromes JS составляет 4 455 000 000 символов, или ~ 8,3 ГБ в памяти.

Но, конечно, это не то, что происходит.У вас всего 4 ГБ ОЗУ, но, согласно рисункам, из ниоткуда появилось ~ 4298 МБ, и есть структуры самой переменной массива, а также Java-виртуальной машины и самого chrome, и т.д. и т.п.

Не говоря уже о том, чтовы нажимаете s + count, а не s, поэтому длина добавляемой строки увеличивается с увеличением количества цифр в счетчике.Если бы s было одинаковым, то его значение, скорее всего, было бы интернировано для экономии памяти движком V8.Для справки: число дополнительных символов, добавленных из-за переменной count и из-за нелинейного увеличения длины, составляет 9,7438,889 символов или 185,85 МБ данных.

Так что должно происходить что-то ещездесь.

Что касается ограничений двигателя V8 JS:

http://code.google.com/p/v8/issues/detail?id=847

32-разрядное адресное пространство памяти является верхним пределом, а для 64-разрядного эта ссылка предполагает~ 1,9 ГБ, хотя весьма вероятно, что это верхний предел возможностей вашей ОС и он физически доступен.

Итак, подведем итог:

  • 32 бита всегда будет верхней границейне вашей конкретной переменной js, а всего пакета js VM, рендерера, содержимого страницы и т. д.
  • Ваш тест не совсем надежен, поскольку подсчитываемые им элементы не идентичны
  • Если бы они были идентичны, вы бы не справились со специальной обработкой строк

edit:

2 голосов
/ 09 ноября 2011

Я включен Chrome, и я попробовал ваш тест, и он завис на том же 14850000, который вы упомянули, даже если у меня есть только 2 ГБ оперативной памяти, и я использую виртуальную машину с окнами внутри моей установки Linux, что я дал 700 МБ оперативной памяти, так что я думаю, да хром имеет ограничение

0 голосов
/ 09 ноября 2011

На 32-битной машине ваш верхний предел всегда будет 4 ГБ, если нет, то и есть, или нет. На практике это будет сильно отличаться от машины к машине (весьма обычно иметь более 10 открытых вкладок)

Лучший способ: держите под рукой только те данные, над которыми активно работает ваш пользователь, или все, что вы не можете быстро получить с сервера. Все остальное получите, когда пользователь просит об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...