Я выбил два небольших фрагмента узла 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
Возможно ли, что файл находится в кеше после первого чтения? какой тест вы выполнили первым? вы пробовали каждый тест несколько раз? – TheBronx
@ TheBronx Я думал о том, что файл также кэшируется. поэтому я сначала имел очень маленький файл, затем постепенно увеличивал его до 33kb, не уверен, что его достаточно большой. Да. Я выполнил бенчмарк несколько раз seqeuntually для каждой настройки - результаты в пределах 4-9 мсек для обоих, но большую часть времени неблокирующие победы –
интересны, этот парень сделал тот же тест: http://afshinm.name/async-vs -sync-io-benchmark-in-nodejs /, но с текстовым файлом 1 Мб и 'ab -n 1000 -c 1000', но он получил ожидаемые результаты (asyn быстрее, чем синхронизация) – TheBronx