2013-05-15 2 views
2

Я выбил два небольших фрагмента узла node.js, которые делают то же самое, написанные блокирующими и неблокирующими способами, просто для измерения разницы в производительности. здесь идет:Почему блокирующий код ведет себя лучше, чем неблокирование?

неблокирующая (традиционный node.js путь):

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

var app = http.createServer(function(req, res){ 
    fs.readFile('lorem.txt',function(err, data){ 
    res.end(data); 
    }); 
}); 

app.listen(8080); 

блокировка:

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

var app = http.createServer(function (req, res) { 
    res.end(fs.readFileSync('lorem.txt')); 
}); 

app.listen(8080); 

lorem.txt это просто текстовый файл примерно 33KB в размере.

Эксплуатация apache benchmark на обоих индикаторах не отличается разницей, а иногда и более высокой производительностью для блокировки версии.

ab -n 100 -c 10 http://locahost:8080/

блокировка: Time per request: 5.701 ms
неблокирующая: Time per request: 8.401 ms

+0

Возможно ли, что файл находится в кеше после первого чтения? какой тест вы выполнили первым? вы пробовали каждый тест несколько раз? – TheBronx

+0

@ TheBronx Я думал о том, что файл также кэшируется. поэтому я сначала имел очень маленький файл, затем постепенно увеличивал его до 33kb, не уверен, что его достаточно большой. Да. Я выполнил бенчмарк несколько раз seqeuntually для каждой настройки - результаты в пределах 4-9 мсек для обоих, но большую часть времени неблокирующие победы –

+0

интересны, этот парень сделал тот же тест: http://afshinm.name/async-vs -sync-io-benchmark-in-nodejs /, но с текстовым файлом 1 Мб и 'ab -n 1000 -c 1000', но он получил ожидаемые результаты (asyn быстрее, чем синхронизация) – TheBronx

ответ

4

метод асинхронного имеет более высокую производительность в более широком смысле, то есть меньшие времена отклика для более (большинствы) одновременные запросы.

Тест, который вы сделали, - это угловой корпус. Предположим, вы увеличиваете количество одновременных запросов или увеличиваете размер возвращаемого ответа. Я уверен, что синхронный метод будет работать с жадностью. Синхронный метод не является хорошим из-за меньшего ответа, но плохого, потому что он не масштабируется вообще. Средний современный компьютер может легко обрабатывать чтение/запись в таком масштабе. Что делать, если вы увеличиваете файлы до 1 МБ? или просит 1 миллион? Подумайте о сервере, который должен иметь дело с гигабайтами хранилища и обслуживать миллионы запросов.

Основная концепция node.js i.e. asynchronous, non-blocking, event driven I/O построена для решения задач масштабируемости, таких как C10k. Вывод, который вы приходите, является односторонним, я уверен, что асинхронный метод выиграет 99% времени в реальном мире.

+0

увеличил файл до 1Mb и '-c 1000 -n 1000', async действительно выигрывает по номерам, но разница едва заметна –

+0

ОК, но за это время метод async определенно будет работать лучше. Разрыв станет все больше и больше. – user568109

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

  • Нет связанных вопросов^_^