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 请求 为基准测试 session 执行的请求数。默认情况下仅执行单个请求,这通常会导致不具有代表性的基准测试结果。
addSync 在 0.613 秒内执行; addAsync 在 2.885 秒内执行
为什么异步代码执行时间较长?也许是因为回调正在创建闭包。
如果有人知道我可以在哪里阅读这些内容,我将非常感激。感谢您的帮助。
最佳答案
您的代码中没有任何内容正在测试异步函数。要测试异步函数,您需要使用异步代码。并且异步不是语法的结果:函数实现本身需要调用 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 installsync-request
即可。
虽然从技术上讲,异步代码的每个函数调用都比同步版本慢,但异步代码完成得更快,因为它发出 10 个并行请求,而不是一次执行一个请求。这就是异步代码的强大之处:它允许您在等待 I/O 的同时运行其他代码,因此您不会浪费 CPU 时间。
关于javascript - 循环中的异步和同步 JavaScript 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291641/