Подтвердить что ты не робот

Chrome считает, что 99,999 резко отличается от 100 000

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

Chrome делает что-то совершенно другое между этими двумя строками:

new Array(99999);  // jsperf ~50,000 ops/sec
new Array(100000); // jsperf ~1,700,000 ops/sec

: http://jsperf.com/newarrayassign/2

Мне было интересно, знает ли кто-нибудь, что происходит здесь!

(Чтобы уточнить, я ищу некоторые низкоуровневые сведения о внутренних компонентах V8, например, используя другую структуру данных с одной и другой, и каковы эти структуры)

4b9b3361

Ответ 1

Просто потому, что это звучало довольно интересно, я искал через кодовую базу V8 для статики, заданной как 100000, и нашел этот kInitialMaxFastElementArray var, который впоследствии используется в функции builtin ArrayConstructInitializeElements function. Хотя я не программист на компьютере и не знаю ничтожного здесь, вы можете увидеть, что он использует цикл if, чтобы определить, меньше ли он 100 000 и return в разных точках на основе этого.

Ответ 2

Ну, всегда существует некоторое пороговое число при разработке алгоритмов, которые адаптируются к размеру данных (например, SharePoint меняет способ работы, когда вы добавляете 1000 пункты к списку). Таким образом, предполагалось, что вы нашли фактическое число, а производительность отличается, поскольку используются разные структуры данных или алгоритмы.

Ответ 3

Я не знаю, какую операционную систему вы используете, но если это Linux, я бы предположил, что Chrome (т.е. malloc) выделяет память из управляемой программой кучи (размер определяется с помощью sbrk, а свободные списки управляются стандартной библиотекой C), но когда вы достигаете порога определенного размера, он переключается на использование mmap, чтобы попросить ядро ​​выделить большие куски памяти, которые не мешают sbrk -установленная куча.

Дуг Лиа описывает, как malloc работает в библиотеке GNU C, лучше, чем я мог. Он написал это.


Или, может быть, 100000 поражает какой-то волшебный порог для объема пространства, необходимого, чтобы он чаще запускал сборщик мусора при попытке выделить память.