循环中异步和同步javascript代码

时间:2015-05-17 20:11:07

标签: 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请求 为基准测试会话执行的请求数。默认情况下只执行单个请求,这通常会导致非代表性的基准测试结果。

addSync在0.613秒内执行; addAsync在2.885秒内执行

为什么异步代码需要更长的时间才能执行?也许是因为关闭巫婆回调正在创造。

如果有人知道我在哪里可以阅读这些内容,我非常感谢。谢谢你的帮助。

1 个答案:

答案 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时间。