Максимальный размер Javascript для типов? - PullRequest
13 голосов
/ 14 января 2011

Рассматривая типы javascript, я пытаюсь выяснить, каков максимальный размер хранилища для некоторых типов данных. Например, я настроил быстрый рекурсивный алгоритм для увеличения размера var до тех пор, пока браузер не выйдет из строя, что в итоге будет примерно 128 МБ (или, может быть, 256) для строк в моей существующей версии Chrome.

Я делал это болезненным способом, потому что не мог найти никаких спецификаций по этому вопросу, но постоянные сбои браузера делают это болезненным испытанием (попытка catch по какой-то причине кажется бесполезной по этой конкретной проблеме).

Я ищу информацию о максимальном размере хранилища для других типов (массив, объект, функции, строки, числа, bools ...)

EMCA-262 раздел 8.4 расплывчат на этом

Длина строки - это количество элементов (то есть 16-битных значений) внутри нее. Пустая строка имеет нулевую длину и поэтому не содержит элементов.

... так что, возможно, это то, что нужно идентифицировать как реализованное в браузерах?

ECMA, однако, сообщает нам о числах, например,

Тип Number имеет ровно 18437736874454810627 (то есть 2 ^ 64−2 ^ 53 + 3) значений, представляющих значения IEEE 754 с 64-разрядным форматом двойной точности, как указано в стандарте IEEE для двоичной арифметики с плавающей точкой, за исключением того, что 9007199254740990 (то есть 2 ^ 53−2) различных значений «не числа» стандарта IEEE представлены в ECMAScript как отдельное специальное значение NaN.

Но тогда я ничего не вижу об объектах.

Что я могу ожидать для использования в браузерах? Есть ли какая-нибудь база кода, которая помогает управлять очень большими объектами и строками?

Сколько памяти я могу выделить в одном скрипте?

Ответы [ 3 ]

7 голосов
/ 14 января 2011

Как вы уже заявили, спецификация не устанавливает какие-либо ограничения / требования к размеру для типов, кроме Number.

Так что это определенно оставлено для реализации.

Например, ограничение Chrome для строк кажется жестко закодированным на уровне около 512 МБ (и меньше на 32-разрядном).

Это накладывает ограничение на максимально возможный запрос выделения в 32-разрядных версиях 2^ 27-1.Максимальная длина плоской строки составляет ~ 2 ^ 28 (пространство 512 МБ), а максимальная длина строки - 2 ^ 29-1, поэтому ни одно из этих ограничений не решает проблему (вместо этого мы бы сгенерировали исключение Out-Of-Memory, если бы они это сделали).

См .: http://code.google.com/p/v8/issues/detail?id=362#c9

Что касается других браузеров, то это потребует некоторых исследований, например, изучения кода Firefox.Но я сомневаюсь, что мы можем сделать то же самое для IE / Opera.

5 голосов
/ 06 мая 2016

ECMA раздел 6.1.4 явно об этом.

«Тип String - это набор всех упорядоченных последовательностей с нулевыми или более 16-разрядными целочисленными значениями без знака (« элементы ») вплоть до максимальной длины 2 ^ 53-1 элементов»

0 голосов
/ 04 марта 2015

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

...