Почему parseInt() намного медленнее, чем * 1 в Firefox?
У меня есть значение, хранящееся как строка, и я знаю, что оно всегда будет целым числом. Но мне нужно это число, поэтому я делал n = n * 1
. Тогда я подумал: "Хм, я должен, вероятно, просто использовать parseInt()
. Затем я запускал некоторые тесты jsperf, и результаты в Firefox были интересны:
http://jsperf.com/parseintx1
По всему форуму, похоже, что операции довольно похожи, кроме Firefox, использование *1
происходит исключительно быстро. Что здесь происходит?
Изменить
Кто-то сделал тест базы 10 и обновил тесты в целом. Нажмите на это тоже, чтобы дать дополнительную информацию: http://jsperf.com/parseintx1/2
Ответы
Ответ 1
Я не эксперт по движку JavaScript каким-либо образом или даже экспертом по компилятору, но я уверен, что это сводится к тому, что компилятор может сказать, что это:
var a = "123";
a = a * 1;
действительно то же самое, что:
var a = 123;
Поскольку "a" является локальной переменной и не используется от точки ее инициализации до этого выражения * 1
, нет никакого кода генерирования точечной информации для выполнения операции вообще. После этого момента компилятор может также сказать, что нет способа, чтобы "а" мог "убежать" от функции, поэтому нет смысла ничего делать; то есть может быть, что тест * 1
заканчивается чем-то, что вам нужно получить:
function() {}
Однако в случае parseInt()
компилятор не может быть уверен, что parseInt()
действительно parseInt()
, поскольку он, возможно, был переопределен. Таким образом, он должен генерировать код для вызова функции.
Ответ 2
Это должна быть тестовая установка, так как эта версия дает ожидаемый результат в Firefox тоже. Я полагаю, что в вашей настройке я использую parseInt
(ну, по крайней мере, в FF) на каждой итерации каждой переменной, тогда как преобразование с String
в Number
может быть применено к первой итерации в тест умножения, после которого переменные являются числовыми, а умножение больше не требует преобразования.
В версии 7 переменные назначаются в тестовой настройке, и тест назначает новые переменные на каждой итерации. Теперь оба теста имеют "равные изменения", а parseInt
превосходит тест умножения.
После проверки теста в IE [8,9] и просмотра его результатов выглядят как результаты FF, я думаю, что есть объяснение для результатов Chrome: я уверен, что Chrome/Webkit имеет лучшую оптимизацию в первой версии тест (особенно часть parseInt
), что дает лучший результат для parseInt
. Это может быть предварительная компиляция (частей) кода в V8 движке, который используется в этих браузерах.