gpt4 book ai didi

javascript - 循环中的异步和同步 JavaScript 代码

转载 作者:行者123 更新时间:2023-12-02 16:10:14 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com