Javascript.RU

Node.js VS Twisted (Just For Fun)

Мини-тест по мотивам восхвалений Node.JS. Хм, а оно действительно неплохо работает...

UPDATE: также см. COMET: серверная часть - паттерны реализации.

Возьмем пример с сайта node.js и поставим там 10 секунд вместо 2. Т.е. будем считать, что COMET-сообщения приходят раз в 10 секунд:

var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
    setTimeout(function () {
        res.writeHeader(200, {'Content-Type': 'text/plain'});
        res.write('Hello World');
        res.close();
    }, 10000);
}).listen(8000);
sys.puts('Server running at 127.0.0.1:8000/');

Создадим аналог на twisted в старых добрых традициях дефередов (ну или если по-русски, то не кривой):

# node.py
from twisted.web import server, resource
from twisted.internet import reactor
from twisted.internet.defer import Deferred

class Simple(resource.Resource):
    isLeaf = True
    def sayHi(self, request):
        request.write('Hello, world!')
        request.finish()

    def render_GET(self, request):
        d = Deferred()
        reactor.callLater(10, d.callback, None)
        d.addCallback(lambda _: self.sayHi(request))
        return server.NOT_DONE_YET

site = server.Site(Simple())
reactor.listenTCP(8001, site)
reactor.run()

Будем тестировать - по 500 одновременных клиентов, всего 10000 запросов.

ab -n 10000 -c 500 http://127.0.0.1:8001/

Запустим на twistd:

Concurrency Level:      500
Time taken for tests:   210.635430 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1200000 bytes
HTML transferred:       130000 bytes
Requests per second:    47.48 [#/sec] (mean)
Time per request:       10531.772 [ms] (mean)
Time per request:       21.064 [ms] (mean, across all concurrent requests)
Transfer rate:          5.56 [Kbytes/sec] received

Обратим внимание:

Time per request:       10531.772 [ms] (mean)

Означает, что вместо 10 сек сервер выполнял каждый запрос в среднем на 0.5 сек дольше. То есть, 5% overhead.

А теперь - на node.js:

Concurrency Level:      500
Time taken for tests:   200.672573 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      750000 bytes
HTML transferred:       110000 bytes
Requests per second:    49.83 [#/sec] (mean)
Time per request:       10033.629 [ms] (mean)
Time per request:       20.067 [ms] (mean, across all concurrent requests)
Transfer rate:          3.65 [Kbytes/sec] received

Здесь имеем оверхед не 5%, а всего лишь 0.3%. Неплохо!

По памяти расклад примерно одинаковый:

13m node
12m twistd
+4

Автор: Гость (не зарегистрирован), дата: 1 марта, 2010 - 15:16
#permalink

Пример на сайте выглядит так:
var sys = require('sys'),
http = require('http');
http.createServer(function (req, res) {
setTimeout(function () {
res.writeHeader(200, {'Content-Type': 'text/plain'});
res.write('Hello World');
res.close();
}, 2000);
}).listen(8000);
sys.puts('Server running at http://127.0.0.1:8000/');


Автор: severality, дата: 1 марта, 2010 - 16:19
#permalink

По-моему, в последних релизах Node.js было много кардинальных изменений, а пример не обновили... Да и сообщение об ошибке недвусмысленно намекает, что надо сделать, чтобы заработало


Автор: ixth, дата: 1 марта, 2010 - 16:31
#permalink

Кстати, чем node.js принципиально отличается от серверного v8? Надо сказать, на простом тесте с выводом строки в цикле он меня несколько разочаровал.


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

Это и есть v8, только к нему прикручен асинхронный API и другие мелкие вкусности.


Автор: Илья Кантор, дата: 28 августа, 2010 - 00:41
#permalink

UPDATE: тест, представленный здесь, лучше бы сделать с другой тестилкой, больше заточенной под много одновременных соединений (не ab).

Пользовал в проекте. По личным впечатлениям - Node.JS быстр, но очень молод. И сегфолтился и тупо прекращал работать, что только не было. Такие дела..


 
Поиск по сайту
Другие записи этого автора
Илья Кантор
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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