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, например, используя другую структуру данных с одной и другой, и каковы эти структуры)
Ответы
Ответ 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 поражает какой-то волшебный порог для объема пространства, необходимого, чтобы он чаще запускал сборщик мусора при попытке выделить память.