2013-11-07 3 views
1

Я был введен в NodeJS несколько месяцев назад. Я хочу учиться достаточно, чтобы написать полезное приложение, которое может обрабатывать умеренную нагрузку. Я не тороплюсь, изучая электронные книги, веб-сайты и код. Мой фон - это случайное программирование на разных языках, включая PHP. Я изучал исходный код для различных пакетов Node, просто чтобы узнать и увидеть лучшие практики. В частности, существуют различные доступные пакеты websocket. Я заметил, что NodeJS авторы, как правило, используют метод объектно-ориентированное структурирование их коду, таким образом, что объекты инстанцированные динамически, например:Использование «New» в NodeJS

var wsRequest = new WebSocketRequest(someParams); 
var wsConnection = new WebSocketConnection(someParams); 
var wsFrame = new WebSocketFrame(someParams); 

просит порождать соединения, соединение зачинать Frames.

Это логично для меня как преимущества ООП. Но в прошлом такие программы, которые я написал на других языках, имели примеры классов, созданных медленно; один раз или в темпе ввода пользователя. Здесь, однако, сложные объекты создаются гораздо быстрее, со скоростью, по меньшей мере, сотен или более в секунду в зависимости от загрузки веб-сайта. Кроме того, я предполагаю, что сборщик мусора должен усердно работать, чтобы очистить вещи. Мой вопрос в том, будет ли процедурный подход к написанию приложений Node более результативен, чем либеральное использование «новых» в обратных вызовах сервера, создавая сложные объекты «на лету»? или представляет собой любое преимущество, минус по сравнению с преимуществами ООП.

+1

Знайте, что в JavaScript существует еще много способов создания объекта, чем 'new'. Существуют литералы массивов ('[]'), литералы объектов ('{}'), функции ('function() {}'), строки '' abc'' и четные числа ('123'). Я не удивлюсь, если ООП мало добавит к общим ассигнованиям. –

ответ

0

Такие объекты очень дешевы, если они используют прототипы *. Просмотрите синтаксис - если вы не будете осторожны, вы, вероятно, создаете функции внутри других функций, они всегда создают очень дорогие объекты каждый раз.

наихудшим что-то вроде этого:

function something() { 
    var a; 
    var b = function() { 
     use(a); 
    }.bind(this); 
} 

Каждый раз, когда вы звоните something() вы создаете объект функции, замыкание и затем привязываются функции. Все это в общей сложности легко 25-50 обычные легкие объекты, такие как WebSocketFrame. Вы даже можете сделать это в цикле или таком.

Если они не используют прототип, вы создаете объект функции для каждого метода для каждого экземпляра и количества мусора будет массивного действительно.


Некоторые номера:

object  32-bit      64-bit 

normal  12+4 for each field   24+8 for each field 
function  36       72 
closure  70       140 
bound-closure 300       600 

Например, класс с 5 полей и 30 методов, реализованных с прототипами:

12 + 4*5 = 32 bytes per instance 

Если он не был реализован с прототипами:

12 + 4*5 + 30 * 36 = 1112 bytes per instance (or 2224 on 64-bit) 

В канонических объектах реализации PHP реализованы как хеш-таблицы, и по этой причине они медленны. Если вы используете конструкторы и прототипы и объекты, как правило, в JS, они будут больше похожими на объекты C++ и Java - на самом деле только с размером в 4 байта, чем объекты Java в HotSpot.

Смежные вопросы