Является ли глубокий объект медленным в JavaScript? Если да, то сколько

Простой вопрос: есть ли смысл использовать мелкий объект над более глубоким? Когда я пишу код, я стараюсь использовать глубокий объект, чтобы его легко понять и классифицировать. Но мне интересно, делает ли этот обычай медленный код.

Я сделал тест, но я понятия не имею, правильно ли я делаю это.

//building necessary objects
var a = {};
var b;
b = a;
for (var i = 0; i < 100; i++) {
  b["a"] = {};
  b = b["a"];
}
var c = {};

//objects used
//a.a.a. ..(101 "a"s).. .a === {}
//c === {}

//1st test: shallow
var d;
var start = performance.now();
for (var i = 0; i < 1000000000; i++) {
  d = c;
  d = null;
}
var end = performance.now();
console.log('Shallow: ' + (end - start));

//2nd test: deeper
var e;
var start = performance.now();
for (var i = 0; i < 1000000000; i++) {
  e = a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a;
  e = null;
}
var end = performance.now();
console.log('Deeper: ' + (end - start));

Ответ 1

  • Вы используете нереалистичный код для проверки "реального кода", который является бессмыслицей.
  • Вы используете Date.now(), который является приблизительным к отметке времени, и вы должны использовать функцию performance.now() для проверки скорости js. В настоящее время даже с хорошим тестовым кодом вы получаете неправильные результаты.
  • Двигатели JS постоянно обновляются. Были времена, когда глубокие объекты были медленными, это не случай больше за последние х лет. Это такая старая проблема, что я даже не могу вспомнить годы или Google ничего ценного.

Ответ 2

Оптимизация в движке js позволяет напрямую обращаться к объектам и допускать обнуление объектов в переменной, которая занимает меньше времени. Таким образом, быстрее обращаться к ним без необходимости проходить через цепочку. Например:

var a={a:{a:{}}}
var b=a.a.a
var c=b
// is faster than 
var c=a.a.a

Для получения дополнительной информации прочтите следующее: Производительность JavaScript: переменные или один объект?