循环中的异步和同步javascript代码 var express=require('express'); var-app=express(); var router=express.router(); 函数addAsync(a、b、回调){ 回调(a+b); } 函数addSync(a,b){ 返回a+b; } 应用程序使用('/main',路由器); 路由器使用(功能(req、res、next){ 对于(变量i=0;i

循环中的异步和同步javascript代码 var express=require('express'); var-app=express(); var router=express.router(); 函数addAsync(a、b、回调){ 回调(a+b); } 函数addSync(a,b){ 返回a+b; } 应用程序使用('/main',路由器); 路由器使用(功能(req、res、next){ 对于(变量i=0;i,javascript,node.js,performance,Javascript,Node.js,Performance,我有两个函数“addSync”和“addAsync”。 我在控制台中使用apache基准测试,如下所示: ab-n 1000-c 1000 哪里: -c并发 一次要执行的多个请求数。默认值是一次一个请求。 -n请求 为基准测试会话执行的请求数。默认情况下,只执行一个请求,这通常会导致非代表性的基准测试结果 addSync在0.613秒内执行; addAsync在2.885秒内执行 为什么异步代码需要更长的时间来执行?可能是因为回调正在创建的闭包 如果有人知道我在哪里可以读到这些东西,我非常感谢。

我有两个函数“addSync”和“addAsync”。 我在控制台中使用apache基准测试,如下所示: ab-n 1000-c 1000 哪里: -c并发 一次要执行的多个请求数。默认值是一次一个请求。 -n请求 为基准测试会话执行的请求数。默认情况下,只执行一个请求,这通常会导致非代表性的基准测试结果

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

为什么异步代码需要更长的时间来执行?可能是因为回调正在创建的闭包


如果有人知道我在哪里可以读到这些东西,我非常感谢。谢谢您的帮助。

代码中没有任何内容是测试异步函数。要测试异步函数,需要使用异步代码。异步并不是语法的结果:函数实现本身需要调用C编解码器异步代码(例如
setTimeout()
),或者本身用C编写

这里有一个更好的测试:

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);
var-request=require('sync-request');
var http=require('http');
//同步测试:获取example.com 10次:
log(“启动同步测试”);

对于(var i=0;iYour
addAsync
函数不是异步的;它与一个额外的函数调用是同步的。你想做什么?谢谢你的评论。实际上我只是想比较异步函数和同步函数的性能。但是你没有任何异步的东西?我应该在循环之外定义回调函数吗mprove perf。我想再次指出,这里没有什么是异步的。异步代码解决了返回vs回调的另一个问题。您在这里测试的实际上是两件事:匿名函数的成本(您可以将回调创建为命名函数)和回调函数调用开销。但这并没有说明异步代码。异步代码让您的代码在等待进程之外(有时甚至在PC之外)发生的事情时做其他事情例如要完成的数据库请求。注意:从技术上讲,node.js不能并行运行代码。异步请求都是一个接一个地发送和处理的。之所以实现并行,是因为生成响应页面的处理发生在
example.com
服务器上。谢谢。这也意味着我无法对异步代码建模仅使用javascript。如果“模型”指的是不使用任何内置异步函数的模型,则不使用。但可以使用
setTimeout()
有效模拟异步延迟。不确定如何模拟兼容的同步延迟还请注意,
example.com
是IETF建立的真实网站,用于解释
“example.com”
是符合互联网标准的保留域名。因此,您可以按原样运行上面的脚本
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..');