Javascript.RU

NodeJS

NodeJS

Пожалуйста пока не оценивайте блог и не комментируйте.

Хочу сделать обучающий блог по NodeJS.

Сравнение производительности с PHP

Самый простой пример с циклом.

NodeJS
Цикл в 1 000 000 000 прошел за 4 секунды.
Код

var n = 1000000000; //1 000 000 000
for(var i=0;i<n;i++){
	
}
console.log("END");

PHP
Цикл в 1 000 000 000 прошел за 1 минута 52 секунды
Код

<?
ini_set("max_execution_time", "10000");
$n = 1000000000; 
for($i=0;$i<$n;$i++){
	
}
echo "END";
?>

Т.е. разница в производительности простого примера в 28 раз!!!

Для чего можно использовать

В принципе для чего угодно, но просто незаменим для highload.

Где уже используется

Система мгновенных сообщений Вконтакта.

Пример чата на nodeJS

!!! Имена берет только на английском почему то!!!
http://92.53.104.192:8081/
Код написан разработчиком nodeJS Раяном Дахл(Ryan Dahl)
Ссылка на код https://github.com/ry/node_chat

Пример 1 - Сколько раз был открыт сайт

var http = require('http');

var i=0;

http.createServer(function (request, response) {
	i++;	
	response.write("Page was opened "+i+" times");
	response.end();
}).listen(8007);

Пример 2 - выдача файла

Размещаем файл index.html в том же каталоге что и server.js
Файл index.html сохраняем в кодировке utf-8 в notepad++.

index.html

<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
	<title>NodeJS - это серверный javascript</title>
</head>
<body>
	NodeJS - это серверный javascript.
</body>
</html>

server.js

var http = require('http');
var fs = require('fs');

http.createServer(function (request, response) {
	fs.readFile('index.html', function (err, data){
		if (err) {
			response.end("File wasn't found");
		}
		response.end(data);
	});
	
}).listen(8007);

Пример 3 - ExtJS+nodeJS

Скрипт запускается на одном сервера, а делает запросы на другой, где есть nodeJS.
Делается это кросс доменными запросами.
NodeJS передает количество раз, которое была запрошена страница.
На сервере стоит замедление на ответ в 2 секунды.

http://vreshenie.ru/work/comet/cross-domain/cross-domain-comet-nodejs.ht...

Если не будет работать значит упал сервер. В nodeJS это постоянно, если не предусматривать все возможные ошибки javascript.
Init и Monit пока настроить не получилось, чтобы это исправить.

Код
index.html

<html>
<head>
	<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/ext-all.css" /> 
    <link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/xtheme-gray.css" />
	<script type="text/javascript" src="http://vreshenie.ru/ext/adapter/ext/ext-base.js"></script> 
	<script type="text/javascript" src="http://vreshenie.ru/ext/ext-all-zip.php"></script> 
	<script src="http://vreshenie.ru/work/comet/cross-domain/extjs-cross-domain.js"></script>
<script>
Ext.onReady(function(){
	function crossDomainRequest(){
		Ext.Ajax.request({
			timeout:300000,
			url: 'http://nodejs.tmweb.ru:8007/',   
			scriptTag: true,
			success: function(r) {				
				var message = r.responseObject.text;
				console.log(message);
				Ext.getCmp('serverMessage').update("Запросов к странице было сделано "+message+"<br>В скрипте не сервере стоит замедление в 2 секунды на ответ.");
				crossDomainRequest();
			}
		});
	}
	new Ext.Window({
		title:'Кросс доменный comet',
		width:250,
		height:150,
		layout:'fit',
		items:[{
			id:'serverMessage',
			autoScroll:true,
			html:'Это место для ответов сервера.<br>На сервер стоит замедление. поэтому придется подождать.'
		}],
		listeners :{
			show:function(){				
				crossDomainRequest();
			}
		}
	}).show();    
});
</script>
</head>
<body>
</body>
</html>

server.js

var http = require('http');
var url = require('url');

var i = 0;

http.createServer(function (request, response) {	
	var parsed = url.parse(request.url,true);
	var callback = parsed.query.callback;
	setTimeout(function(){
		i++;
		var answer = callback+"({'status':'success','text':'"+i+"'})";
		response.end(answer);
	},2000);	
}).listen(8007);

Простейший пример чата

Вот что получилось.
Многое надо переделать, но он работает.
Если чат не работает, значит слетел nodeJS.
Писать можно только на английском, ник тоже лучше использовать английский.
Как время будет улучшу.

http://vreshenie.ru/work/comet/cross-domain/chat.html

index.php

<html>
<head>
	<link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/ext-all.css" /> 
    <link rel="stylesheet" type="text/css" href="http://vreshenie.ru/ext/resources/css/xtheme-gray.css" />
	<script type="text/javascript" src="http://vreshenie.ru/ext/adapter/ext/ext-base.js"></script> 
	<script type="text/javascript" src="http://vreshenie.ru/ext/ext-all-zip.php"></script> 
	<script src="http://vreshenie.ru/work/comet/cross-domain/extjs-cross-domain.js"></script>
	<style>
		.icon-user {
			background-image: url(http://www.vreshenie.ru/resources/user.png) !important;
		}
		.icon-pencil {
			background-image: url(http://www.vreshenie.ru/resources/pencil.png) !important;
}		Ъ
	</style>
<script>
var messages = [];
Ext.onReady(function(){
	
	function sendMessage(login){
		var msg = Ext.getCmp('idMsgChat').getValue();
		if(msg.length!=0){
			crossDomainRequest('sendMessage',{login:window.login,msg:msg,action:'sendMessage'})
		}
	}

	function runLoginedChat(){
		var win = Ext.getCmp('windowChat');
		win.setTitle('Кросс доменный comet chat на ExtJS+nodeJS');
		
		var login = Ext.getCmp('login');			
		win.items.items[1].el.fadeOut({callback:function(){
			login.hide();
		}});
		
		var buttonLogin = Ext.getCmp('idLoginButton');
		buttonLogin.setText('Отослать');
		buttonLogin.setIconClass('icon-pencil');
		buttonLogin.setHandler(sendMessage,{login:login});
		
		var xy=win.getPosition();
		var x = xy[0]-100;
		var y = xy[1]-100;
		win.el.shift({
			x: x,
			y: y,
			duration:1,
			//easing:effect,
			callback:function(){
				win.el.shift({
					width:400,
					callback:function(){
						win.setWidth(400);
						win.setHeight(300);
						crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
						Ext.getCmp('idMsgChat').show();
						Ext.getCmp('serverMessage').show();
					}					
				});
			}
		});
	}
	
	function crossDomainRequest(action,params){
		Ext.Ajax.request({
			timeout:300,
			url: 'http://nodejs.tmweb.ru:8008/',
			params:params || {},
			scriptTag: true,
			success: function(r) {
				var message = r.responseObject.text;
				var login = r.responseObject.login;
				//console.log(message);
				//console.log(r);
				if(action=='getMessage'){
					if(!r.responseObject.reconnect){
						messages.push({msg:message,login:login});
						var str=' ';
						messages.forEach(function(v){
							str+= "" + v.login+": "+v.msg+'<br>';
						});
						Ext.getCmp('serverMessage').update(str);
					}
					crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
				}
				if(action=='login'){
					//Ext.getCmp('serverMessage').update("Сообщение "+message+" ");
					runLoginedChat();
					//console.log(message);
				}
				if(action=='sendMessage'){}
			},			
			failure:function(){
				console.log('failure');
				if(action=='getMessage'){
					crossDomainRequest('getMessage',{login:window.login,action:'getMessage'});
				}
			}
		});
	}
	
	function chatLogin(){		
		var login = Ext.getCmp('login').getValue();
		window.login=login;
		crossDomainRequest('login',{login:login,action:'login'});
	}
	
	new Ext.Window({		
		id:'windowChat',
		shadow:false,
		iconCls:'icon-user',
		title:'Вход в чат',
		width:270,
		height:95,
		layout:'form',
		bodyStyle:'padding:5px 5px 0',
		items:[{		
			id:'serverMessage',
			bodyStyle:'padding:5px 5px',
			height:230,
			hidden:true,
			autoScroll:true,			
			html:'Сюда приходят сообщения'
		},{
			id:'login',
			xtype:'textfield',
			fieldLabel:'Укажите ник'			
		}],
		bbar:[{
			id:'idMsgChat',
			xtype: 'textfield',
			width:300,
			hidden:true,
		},'->',{
			id:'idLoginButton',
			text:'Войти',
			iconCls:'icon-user',
			handler:chatLogin
		}]
	}).show();	
});
</script>
</head>
<body>
</body>
</html>

server.js

var http = require('http');
var url = require('url');
var sys = require('sys');

var clients = [];//{name:'root',response:response}

http.createServer(function (request, response) {
	var endConnection = function(answer){
		response.end(answer);
	}
	
	var parsed = url.parse(request.url,true);
	var callback = parsed.query.callback;
	if(!callback){
		var answer = callback+"({status:'failure',text:\"Wasn't get name callback function for cross-domain.\"})";
		endConnection(answer);
	}
	var action = parsed.query.action;
			
	switch(action){
		case 'login':
			var login = parsed.query.login;
			var callback = parsed.query.callback;
			clients.forEach(function (v) {
				if(login==v.name){
					answer = callback+"({status:'failure',text:\"This name is busy. Check another one.\"})";
					endConnection(answer);
				}
			});
			
			clients.push({name:login,callback:callback});
			//console.log(clients);
			
			answer = callback+"({status:'success',text:'true'})";
			endConnection(answer);
			
			break;
		case 'getMessage':
			var login = parsed.query.login;
			var callback = parsed.query.callback;
			clients.forEach(function (v) {
				console.log(login==v.name);
				console.log(login+"=="+v.name);
				if(login==v.name){
					v.response=response;
					v.callback=callback;
				}
			});
			setTimeout(function(){
				answer = callback+"({status:'success',reconnect:true,text:\"Hi.\"})";
				endConnection(answer);
			},25000);
			break;
		case 'sendMessage':
			var msg = parsed.query.msg;
			var login = parsed.query.login;
			clients.forEach(function (v) {
				console.log(v.callback);
				console.log(v.name);
				console.log(v.response);
				v.response.end(v.callback+"({status:'success',login:'"+login+"',text:'"+msg+"'})");
			});
			endConnection(callback+"({status:'success'})");
			break;
		default:			
			var answer = callback+"({'status':'failure','text':'This action is not defined'})";
			response.end(answer);
	}
}).listen(8008);
+3

Автор: deeperton (не зарегистрирован), дата: 7 марта, 2011 - 19:21
#permalink

А давайте включим Zend Optimizer для php?
Вы забыли про оптимизации которые делает V8, что он фактически компилирует код в нативный для процессора, а не производит на каждой итерации цикла интерпретацию путь уже и распарсенного байт-кода которые далеко еще не машинный (случай с php).

Следовало бы это объяснить новичкам, а то кинутся сейчас все на node.js не узнав даже про возможности оптимизации php. Он в опытных руках, то же может многое показать.

Вы забыли упомянуть о том перевороте мозга который нужно сделать чтоб писать на JavaScript полностью в асинхронном стиле, о том КАК это весело и просто. Это ведь уже не просто AJAX-callback'и с выводом alert и наполнением кусочков страниц новым текстом...


Автор: mycoding, дата: 7 марта, 2011 - 21:26
#permalink

Я так не люблю ни с кем спорить)))
Я не использую никаких php framework-ов.
Я пишу свои php классы.

Если надо сделать очень мощный проект, который на одном сервере не уместится, то nodeJS идеальное решение.
Каждый сервер, это деньги.

Никакая php оптимизация не сократит скорость выполнение кода в 28 раз.
И в итоге писать серверную сторону либо на С либо на nodeJS.

Еще раз прочитал Ваше сообщение.
Я не совсем понял, Вы хотите сказать, что с помощью Zend Optimizator можно получить что-то похоже по производительности на байт код?(Не очень сформулировал, но думаю Вы поняли вопрос)


Автор: deeperton (не зарегистрирован), дата: 9 марта, 2011 - 00:21
#permalink

Я про категоричность и однобокость рассмотрения вопроса.
Я согласен, что node.js в разы быстрее php. Но нельзя так грубо и без аргументирования отправлять его в полные аутсайдеры к черепахам... вроде руби (сейчас меня порвут рубисты).

Может сравним еще C++ и node.js? Спрогнозируете результат? Я бы описал его так — можно ТАК на говнокодить на C++, что и php его сделает как маленького.

Много зависит от реализации, от прямолинейности рук программиста. То что один напишет на node.js и будет кричать что его МАКСИМАЛЬНО быстрое, вполне может обломиться перед решением на php которое будет и меньше памяти кушать и быстрее работать, а все потому, что автор кода использует не пузырек для сортировки массива в 10 млн. 4х байтовых чисел, а что-то по умнее...


Автор: I-zone, дата: 14 марта, 2011 - 22:04
#permalink

На мой взгляд пример с циклом очень показателен. Как видите, исполнен в обоих языках он родной конструкцией и о каком 'говнокоде' вы говорите. Если вы согласны с утверждением, о скорости node превышающей в разы php и видите пример с этим доказательством (причем код в обоих языках абсолютно равнозначен) зачем нужно доказывать обратное, звучащее абсурдно. PHP слишком задержался на вершине популярности и на мой взгляд ему уже давно пора 'к черепахам'. Я рад, что появилась платформа node. Это не просто высокоскоростная, но и очень гибкая, удобная и многообещающая платформа для программистов. Она расходует невероятно мало памяти, т.к. выделяется она автоматически по мере необходимости. Если Вы до сих пор несогласны, выкладывайте другие тесты, чтобы мы убедились


Автор: кто-то (не зарегистрирован), дата: 8 марта, 2011 - 06:10
#permalink

Это плохой пример, почти все движки JS оптимизируют пустые конструкции, PHP же этого не делает. Попробуйте в этом цикле вывести i, в итоге увидете результат своими же глазами, а заодно и более точное сравнение.


Автор: mycoding, дата: 8 марта, 2011 - 08:33
#permalink

Функции вывода являются очень медленными в любом языке программирования.
Чтобы в этом убедится попробуйте сделать пример вывода i на С.

Даже если в nodeJS внутрь поместить простой код проверки, который делает несколько ненужных действий скорость таже - 4 секунды.

Код

var a = 5;
var b = 6;

for(var i=0;i<1000000000;i++){
	if(i%2==0){
		var c = a;
		a = b;
		b = c;
	}
	else{
		var c = b;
		b = a;
		a = c;
	}
}

console.log('END');

Автор: I-zone, дата: 8 марта, 2011 - 16:35
#permalink

А знаете, материал, которому вы хотите посвятить статью очень не плох. Может получится что-то дельное. Вроде статей Ильи Кантора. Этакий faq для node.js, по крайней мере гораздо полезнее чуда-тетрисов от горе-писателей и прочей чуши, которую последнее время любят писать в блогах. Только пожалуйста пишите без ошибок и школьного 'вконтакта', и не скупитеть на примеры. Если получится неплохая статья, можно попросить Илью закрепить её в боковой панели. Удачи вам.


Автор: mycoding, дата: 8 марта, 2011 - 16:50
#permalink

Спасибо, я постараюсь.
Мне nodeJS нужен в нескольких проектах.
Сейчас активно изучаю, как только что-то дельное получится
выложу.


Автор: Гость (не зарегистрирован), дата: 8 марта, 2011 - 22:28
#permalink

а как вы NodeJS для хайлоада использовать хотите если он не поддерживает мультпроцессорность(точнее этого неделает V8)


Автор: mycoding, дата: 8 марта, 2011 - 22:44
#permalink

Пока еще рано о чем то говорить, надо научится.
Сейчас самое сложно его поставить.
У меня стоит тестовая windows версия, которая
даже для локального тестирования не подходит.


Автор: deeperton (не зарегистрирован), дата: 9 марта, 2011 - 00:25
#permalink

Так вы еще и под форточками тестируете...

С многопроцессорностью или многоядерностью поступают просто — сколько реальных физических ядер, столько и node.js запускают.


Автор: I-zone, дата: 12 марта, 2011 - 02:25
#permalink

Нет, видимо ничего хорошего всё таки не получится. А жаль...


Автор: mycoding, дата: 12 марта, 2011 - 09:09
#permalink

Вы наверное так написали, потому что увидели на ссылке It works.
Дело в том, что nodeJS почему то слетает во время работы.

Вообще не так то легко ему обучиться.
NodeJS только год а то и меньше назад появился.
Ни одной книги на данный момент нет.

Плюс к этому, надо очень хорошо разбираться в настройке серверов, в nginx
и прочем.

Если бы Вы тоже попробовали, Вы поняли что это реально сложно.


Автор: I-zone, дата: 12 марта, 2011 - 12:45
#permalink

В данный момент занимаюсь именно им. Появился он в 2008 году. Выходит 3 года назад. Я думал, что это будет статья, которая открывает возможности, показывает сравнительные тесты, описывает общие нюансы и т.д. Собственно не радует появления пункта с какими то чатами. Зачем они здесь? Это не опыт программирования и даже не средство разработки (напр. framework). Не в том направлении, как мне кажется идет развитие статьи. Но она ваша и вам решать, конечно :-)


Автор: mycoding, дата: 12 марта, 2011 - 13:03
#permalink

Если у Вас есть опыт, то напишите пожалуйста как считаете нужным.
Мне нужен опыт и практика. И где то размещать свои наработки.

Если Вы сделаете очень хорошую статью я буду Вам очень благодарен.
Мне nodeJS очень нужен для работы.


Автор: I-zone, дата: 14 марта, 2011 - 12:39
#permalink

Вся проблема во времени


Автор: Гость (не зарегистрирован), дата: 23 апреля, 2015 - 12:33
#permalink

Но по-любому где-то подвох. Без этого не бывает. Хотя мне nodejs тоже понравился, но только тем, что от php можно вообще отказаться и писать всё в одном духе. Правда стиль php более понятен, чем стрепня на java. callback - портит мозги, считаю херню заманчивой, но как и вся эта web-побасятина - бесполезный хлам и зря потраченное время, америкосы сделают из нашего нового поколения расу рабов и победят без войны, уничтожив русский моск. Будешь ходить и хвастаться своей стрепнёй, как она хорошо работает, какая красивая, и только ...


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
6 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Другие записи этого автора
mycoding
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Популярные таги
Последние комментарии
Последние темы на форуме
Forum