2013-09-26 73 views
1

考虑以下代码:节点JS的请求过程性能

var http = require("http"); 
http.createServer(function(request, response) { 
    for (var i = 0; i < 1000000; i++) { 
     console.log("Request received"); 
    } 
    response.writeHead(200, { 
     "Content-Type": "text/plain" 
    }); 
    response.write("Hello World"); 
    response.end(); 
}).listen(8888, "127.0.0.1"); 

如果我们运行这段代码,我们应该等待多分钟也获得response.But如果在对运行不console.log("Request received");对于我们得到的响应与高速? 为什么?

+3

你认为写一些东西到控制台/日志是一样快,没有做任何操作?为什么? – WiredPrairie

回答

0

我认为是因为在控制台写入console.log("Request received");得到时间的过程。

1

console.log与其他任何打印/回显/系统输出在您的STDOUT控制台上执行某些操作相当缓慢。

编辑:除此之外,解释器将简单地跳过循环,如果没有在其中的操作。如果你真的做了一些事情,那当然需要时间。

+0

你确定循环会跳过吗?在循环的条件和步骤中可能会发生重要的事情。编辑:实际上,循环确实得到运行。你可以通过计时循环来看到这个空身体,但不同的界限 - 对'i'的更高限制将运行更长时间。 –

+0

@AaronDufour非常有趣,谢谢你的信息。我认为V8会自动分析这个。 –

+0

当您第二次运行它时可能会跳过 - V8使用统计分析器来确定什么是热代码以及尝试优化的位置 –

2

简单地说,一个空的“for”循环几乎为空。 但是console.log()的输出需要更多的时间,并且它也是同步的。

2

首先开始V0.6console.log()是同步的(即它会阻止主事件循环。)

你写了周围17MBs标准输出对每个请求。服务器可能需要几分钟才能响应。