Локальные переменные берут 7x дольше к доступу, чем глобальные переменные?

Я пытался сравнить усиления/потери "кэширования" 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, мои усилия "оптимизировать" на самом деле замедленный сценарий МНОГО...

Там какой-либо другой путь состоит в том, чтобы сделать мой код более "эффективным"...? Я на этапе, где я в основном должен оптимизировать, таким образом, не, это не "преждевременная оптимизация"...

6
задан Warty 20 April 2010 в 22:02
поделиться

3 ответа

Эти две переменные помечены неправильно:

var mathfloor: <span id="globalResult"></span>ms <br />
window.mathfloor: <span id="localResult"></span>ms <br />

@ Альтернативы Дэвида заслуживают внимания, равно как и своего рода воспоминания.

2
ответ дан 17 December 2019 в 20:30
поделиться

Изменить: Ой, я не читал ответ о перепутанном имени поля. Оказывается, в Firefox доступ к локальной переменной был быстрее (занимал 80%), чем доступ к Math.floor, но доступ к глобальной переменной занимал 140% больше времени.

В моем первоначальном ответе я постулировал, что к локальным переменным труднее получить доступ, чем к глобальным, из-за обработки замыкания и прочего. Однако, похоже, все наоборот.

0
ответ дан 17 December 2019 в 20:30
поделиться

Я не уверен, почему ваши тесты делают то, что они делают.

Но если вы собираетесь часто вызывать 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);
};​
0
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: