2015-09-09 4 views
0

Я хочу использовать концепцию скрытого класса для быстрого создания моего веб-приложения.Как оптимизировать использование методов оптимизации скрытых классов v8?

Я пробовал следующий код из учебника по использованию скрытого класса, но он по-прежнему показывает резкие результаты.

var PROPERTIES = 10000000; 

function O(size) { 
    for (var i = 0; i < size; i++) { 
    this[i] = null; 
    } 
} 

var o = new O(PROPERTIES); 

var start = +new Date; 

for (var i = 0; i < PROPERTIES; i++) { 
    o[i] = i; 
} 

console.log(+new Date - start); 

Вот jsperf link for benchmarking

Является ли это правильно или есть что-то неправильно в моей реализации?

+0

Почему вы думаете, что здесь будут созданы скрытые классы? Вы устанавливаете все свои свойства внутри конструктора и изменяете только значения тех же (существующих) свойств. – mscdex

+0

@mscdex: Я думаю, он придерживается этой ссылки: http://debuggable.com/posts/understanding-hidden-classes-in-v8:4c7e81e4-1330-4398-8bd2-761bcbdd56cb –

ответ

2

Я думаю, вы неправильно поняли концепцию скрытых классов.

В принципе, обе реализации создают скрытые классы. Разница заключается в том, что вторая реализация движется, создавая скрытые классы для инициализации состояния, поэтому при назначении фактических данных она быстрее, чем первая реализация.

В jsfidde, время доступ к свойствам разница

var PROPERTIES = 10000000; 

var obj = {}; 

var s = Date.now(); 

for (var i = 0; i < PROPERTIES; i++) { 
    obj[i] = i; 
} 

console.log(Date.now() - s); 

Slower

var PROPERTIES = 10000000; 

var Class = function() { 
    for (var i = 0; i < PROPERTIES; i++) { 
     this[i] = null; 
    } 
}; 

var obj = new Class(); 

var s = Date.now(); 

for (var i = 0; i < PROPERTIES; i++) { 
    obj[i] = i; 
} 

console.log(Date.now() - s); 

Faster

Но общее время выполнения такие же, как вы можете видеть в вашем JSPerf.

Понимая это, мы можем оптимизировать время отклика, предварительно создавая все скрытые классы, поэтому при обработке запроса/логики доступ к свойствам может быть быстрее.

+0

Как возможно, что есть такие резкое изменение производительности – Amir

+0

Это не имеет никакого отношения к скрытым классам, хотя, прежде всего, V8 делает * не * создает скрытые классы для каждого индивидуального присвоенного присвоения свойств (индексированные свойства - '0',' 1' и т. д.). Индексированные свойства обрабатываются действительно отличными от именованных свойств в системе скрытого класса. Разница в производительности, которую вы видите, связана с предварительным распределением * массива *. Оригинальное сообщение, которое вы читаете @Amir, было ошибочным в объяснении того, что происходит. Не обращайте внимания на то, что там написано. –