Я пытался сравнить усиления/потери "кэширования" math.floor в надеждах, что я мог выполнить вызовы быстрее.
Здесь был тест:
<html>
<head>
<script>
window.onload = function()
{
var startTime = new Date().getTime();
var k = 0;
for(var i = 0; i < 1000000; i++) k += Math.floor(9.99);
var mathFloorTime = new Date().getTime() - startTime;
startTime = new Date().getTime();
window.mfloor = Math.floor;
k = 0;
for(var i = 0; i < 1000000; i++) k += window.mfloor(9.99);
var globalFloorTime = new Date().getTime() - startTime;
startTime = new Date().getTime();
var mfloor = Math.floor;
k = 0;
for(var i = 0; i < 1000000; i++) k += mfloor(9.99);
var localFloorTime = new Date().getTime() - startTime;
document.getElementById("MathResult").innerHTML = mathFloorTime;
document.getElementById("globalResult").innerHTML = globalFloorTime;
document.getElementById("localResult").innerHTML = localFloorTime;
};
</script>
</head>
<body>
Math.floor: <span id="MathResult"></span>ms <br />
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
</body>
</html>
Мои результаты теста:
[Chromium 5.0.308.0]:
Math.floor: 49ms
var mathfloor: 271ms
window.mathfloor: 40ms
[IE 8.0.6001.18702]
Math.floor: 703ms
var mathfloor: 9890ms [LOL!]
window.mathfloor: 375ms
[Firefox [Minefield] 3.7a4pre]
Math.floor: 42ms
var mathfloor: 2257ms
window.mathfloor: 60ms
[Safari 4.0.4[531.21.10] ]
Math.floor: 92ms
var mathfloor: 289ms
window.mathfloor: 90ms
[Opera 10.10 build 1893]
Math.floor: 500ms
var mathfloor: 843ms
window.mathfloor: 360ms
[Konqueror 4.3.90 [KDE 4.3.90 [KDE 4.4 RC1]]]
Math.floor: 453ms
var mathfloor: 563ms
window.mathfloor: 312ms
Различие случайно, конечно, но по большей части
Во всех случаях [это показывает время, потраченное]:
[занимает больше времени] mathfloor>, Math.floor> window.mathfloor [быстрее]
Почему это? В моих проектах я использовал var mfloor = Math.floor
, и согласно моим сравнительным тестам not-so-amazing, мои усилия "оптимизировать" на самом деле замедленный сценарий МНОГО...
Там какой-либо другой путь состоит в том, чтобы сделать мой код более "эффективным"...? Я на этапе, где я в основном должен оптимизировать, таким образом, не, это не "преждевременная оптимизация"...
Эти две переменные помечены неправильно:
var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />
@ Альтернативы Дэвида заслуживают внимания, равно как и своего рода воспоминания.
Изменить: Ой, я не читал ответ о перепутанном имени поля. Оказывается, в Firefox доступ к локальной переменной был быстрее (занимал 80%), чем доступ к Math.floor, но доступ к глобальной переменной занимал 140% больше времени.
В моем первоначальном ответе я постулировал, что к локальным переменным труднее получить доступ, чем к глобальным, из-за обработки замыкания и прочего. Однако, похоже, все наоборот.
Я не уверен, почему ваши тесты делают то, что они делают.
Но если вы собираетесь часто вызывать Math.floor, вы можете использовать это:
var num = 9.99;
var floored = ~~num; // 9
Не то, чтобы ~~
, вероятно, не сработали на строках ( var num = "9.99"
), числа вне 32-битного диапазона и отрицательные числа ( ~~
округляются в большую сторону).
См. этот вопрос для получения дополнительной информации.
ОБНОВЛЕНИЕ
Вот модифицированный тест
В Chrome я получаю локальную область видимости, возвращающуюся быстрее, чем Math.floor и глобальную область. (window.mfloor) Обратите внимание, что я не ссылаюсь на глобальный mfloor с окном .
синтаксис как в исходном тесте.
Итак, я думаю, что в вашем тесте есть 2 проблемы (помимо смешанного имени переменной, упомянутого в других ответах). Одна из них заключается в том, что вы запускали цикл на window.mfloor, а другая в том, что у вас была локальная переменная с тем же именем, что и глобальная переменная (это просто предположение).
Попробуйте выполнить тест, используя размещенную мной ссылку jsbin, и вернитесь ко мне.
вот мой тест для ленивых:
window.onload = function(){
var k = 0, i=0, n = 2000000,
startTime = +(new Date);
for(; i < n; ++i) k += Math.floor(9.99);
var mathFloorTime = (new Date) - startTime;
window.globalMfloor = Math.floor;
k = i = 0;
startTime = +(new Date);
for(; i < n; ++i) k += globalMfloor(9.99);
var globalFloorTime = (new Date) - startTime;
var mfloor = Math.floor;
k = i = 0;
startTime = +(new Date);
for(; i < n; ++i) k += mfloor(9.99);
var localFloorTime = (new Date) - startTime;
alert("Math.floor: " + mathFloorTime);
alert("globalMfloor: " + globalFloorTime);
alert("mfloor: " + localFloorTime);
};