ivinnic
@ivinnic
Full-Stack - подустал

Почему отличается время перебора объектов одного класса от множества классов?

Добрый день!

Из-за моей ошибки возникла ситуация, которую очень хотелось бы понять.
Время на цикл (50 тыс итераций) перебора и обращение к свойствам экземпляров одного класса существенно отличается от времени перебора экземпляров разных классов. 2 мс против 40мс.

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

Код:
let length = 50000;

let list_of_one = [];
let main_class = getClass();

for(let i = 0; i<length;i++){
  list_of_one.push(new main_class()) 
}

let list_of_many = [];
for(let i = 0; i<length;i++){
  let main_class = getClass()
  list_of_many.push(new main_class())
}


performanceTest(list_of_one)  // результат ~2ms
performanceTest(list_of_many)  // результат ~40ms



function performanceTest(list){
 console.time('time')
  let c = list.length
  for(let i = 0; i<c;i++){
    	list[i].buffer_data_calc.color[3] = i
  }
  console.timeEnd('time')
}


function getClass(){
 class Main {
   id=23;
   type= 1;
   buffer_data_calc={color:[1,2,3,4,5]};
   init(){

   }
 }
    return Main
}


p.s было замечено что уже на поиск свойства buffer_data_calc уходит большая времени...

JS Fiddle

От Сергей Соколов - кейс на jsPerf
  • Вопрос задан
  • 229 просмотров
Пригласить эксперта
Ответы на вопрос 1
Lynn
@Lynn
nginx, js, css
Почитайте статьи как работают движки JS.
Можно начать с этой https://mathiasbynens.be/notes/prototypes

Если очень кратко, то V8 (движок JS в Chrome, node.js и т.п.) анализирует и оптимизирует выполняемый код. В частности в первом случае он понимает что на входе всегда один и тот же класс и оптимизирует доступ к его полям. Во втором случае он каждый раз честно проверяет «а есть ли атрибут buffer_data_calc? есть ли у него атрибут color? а это точно массив? а в нём есть 3 элемент? и т.п»
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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