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

标签 javascript node.js performance

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/

相关文章:

javascript - 如何在 javascript 中使用 npm 脚本

c++ - 嵌套 Ifs VS 2 个独立的 IFs - 性能方面?

python - 计算字符串 Python3.6 中子字符串实例的最快方法

c++ - A*寻路慢

javascript - 为什么我的 Bootstrap 按钮在窗口缩小时重叠

javascript - 我可以使用 JavaScript 变量设置元素样式吗?

javascript - 仅在另一个函数完成时运行一个函数

javascript - 如何通过添加 for 循环来遍历 data.games 来重写搜索函数,并在搜索时添加它显示的分数?

javascript - node.js + mikeal/request - 如何测量请求时间?

javascript - 编写自定义 webpack 解析器