var express = require('express');
var app = express();
var router = express.Router();
function addAsync(a, b, callback) {
callback( a + b );
}
function addSync(a, b) {
return a + b;
}
app.use('/main', router);
router.use(function(req, res, next) {
for (var i = 0; i < 100000; ++i) {
addAsync(1, 2, function(a, b) {
});
//addSync();
}
next();
});
app.listen(3001);
我有2个函数“addSync”和“addAsync”。 我在控制台中使用apache基准测试,如下所示: ab -n 1000 -c 1000 http://localhost:3001/main 哪里: -c并发 一次执行多个请求的数量。默认是一次一个请求。 -n请求 为基准测试会话执行的请求数。默认情况下只执行单个请求,这通常会导致非代表性的基准测试结果。
addSync在0.613秒内执行; addAsync在2.885秒内执行
为什么异步代码需要更长的时间才能执行?也许是因为关闭巫婆回调正在创造。
如果有人知道我在哪里可以阅读这些内容,我非常感谢。谢谢你的帮助。
答案 0 :(得分:2)
您的代码中没有任何内容可以测试异步函数。要测试异步功能,您需要使用异步代码。而async不是语法的结果:函数实现本身需要调用C编解码器异步代码(例如setTimeout()
)或者本身用C语言编写。
这是一个更好的测试:
var request = require('sync-request');
var http = require('http');
// sync test: get example.com 10 times:
console.log('starting sync test');
for (var i=0; i<10; i++) {
var res = request('GET', 'http://www.example.com');
console.log(res.getBody().length + ' bytes');
}
console.log('done sync test');
// async test
console.log('starting async test');
var processing = 10;
for (var i=0; i<10; i++) {
http.get("http://www.example.com", function(res) {
var body = '';
res.on('data', function(chunk) {
body += chunk.toString();
});
res.on('end', function() {
processing--;
console.log(body.length + ' bytes');
if (processing == 0) {
console.log('done async test');
}
});
});
}
console.log('async requests all queued..');
请注意,您需要安装sync-request
。只需npm install sync-request
。
虽然异步代码的每个函数调用在技术上都比同步版本慢,但是异步代码完成得更快,因为它发出10个并行请求而不是一次执行一个。其中有异步代码的强大功能:它允许您在等待I / O时运行其他代码,因此您不会浪费CPU时间。