Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在HTTP模式下,node.js是否比Java具有显著的性能优势?_Java_Performance_Node.js_Sockets_Http - Fatal编程技术网

在HTTP模式下,node.js是否比Java具有显著的性能优势?

在HTTP模式下,node.js是否比Java具有显著的性能优势?,java,performance,node.js,sockets,http,Java,Performance,Node.js,Sockets,Http,我刚刚开始在node.js中编写代码。下面是我的一个问题: 在HTTP应用程序中,给定请求-响应模型,单个应用程序线程被阻塞,直到所有后端任务完成并将响应返回到客户端,因此性能改进似乎仅限于微调后端,如并行IO请求。(好的,当涉及到许多重的和独立的IO操作时,这种改进很重要,但通常情况下,这种情况还意味着通过重新设计数据结构,您可以消除大量的IO请求,并且最终可能获得比仅发出并行化IO请求更好的性能操作。) 如果这是真的,那么它如何能够产生比那些基于Java(或PHP、python等)的框架更好

我刚刚开始在node.js中编写代码。下面是我的一个问题:

在HTTP应用程序中,给定请求-响应模型,单个应用程序线程被阻塞,直到所有后端任务完成并将响应返回到客户端,因此性能改进似乎仅限于微调后端,如并行IO请求。(好的,当涉及到许多重的独立的IO操作时,这种改进很重要,但通常情况下,这种情况还意味着通过重新设计数据结构,您可以消除大量的IO请求,并且最终可能获得比仅发出并行化IO请求更好的性能操作。)

如果这是真的,那么它如何能够产生比那些基于Java(或PHP、python等)的框架更好的性能呢

我还提到一篇文章,其中也解释了这种情况:

它实际上是一个单线程运行:您不能执行任何并行代码 执行;例如,执行“睡眠”将阻塞服务器一个小时 第二:

while(新日期().getTime()
…但是,除了您的代码之外,其他一切都是并行运行的

我亲自验证了这一点,将“睡眠”代码放入一个IO回调闭包中,并尝试提交一个导致此回调的请求,然后提交另一个。这两个请求在处理时都会触发控制台日志。我的观察是后者被阻止,直到前者返回响应

那么,这是否意味着只有在socket模式下,双方可以随时向对方发送事件和推送消息,才能充分利用其异步处理能力

我对此有点困惑。欢迎提出任何意见或建议。谢谢

更新

我问这个问题是因为有些绩效评估案例 比如,, 和。 一些激进的观点声称J2EE将被完全取代:

就我在node.js方面的经验(虽然很简单)而言,我同意node.js服务器的性能无法与node.js文档中所述的其他Web服务器(如tomcat等)相比

它实际上是一个单线程运行:您不能执行任何并行代码 执行;例如,执行“睡眠”将阻塞服务器一个小时 第二:

因此,我们使用它并不是作为像tomcat这样成熟的Web服务器的替代品,而是为了分配来自tomcat的一些负载,在这里我们可以使用单线程模型。因此,必须在某个地方进行权衡


还可以看到这篇关于node.js的漂亮文章。NodeJS使用libuv,因此IO操作是非阻塞的。是的,您的节点应用程序使用1个线程,但是,所有IO请求都被推送到事件队列。然后,当发出请求时,很明显,它的响应不会在零时间从套接字、文件等读取。因此,将弹出队列中准备就绪的内容并对其进行处理。同时,您的请求可以得到响应,可能需要读取块或完整数据,但它们只是在队列中等待处理。这将一直持续到没有事件剩余,或者打开的套接字关闭为止。然后NodeJS最终可以结束它的执行

正如您所看到的,NodeJS与其他框架不同,非常不同。如果您有一个长期的非IO操作,因此它是阻塞的,如矩阵操作、图像和视频处理,您可以生成另一个进程,并将作业分配给它们,使用消息传递,就像您喜欢的TCP、IPC方式一样

NodeJS的要点是删除不必要的上下文切换,如果使用不当,这些切换会带来巨大的开销。在NodeJS中,为什么需要上下文切换?所有的作业都被推到事件队列中,它们在计算中可能很小,因为它们只做多个IO/S,(从DB读取、更新DB、写入客户机、写入裸TCP套接字、从高速缓存读取),将它们停在中间并切换到另一个作业是不合理的。因此,在libuv的帮助下,无论哪个IO已经准备好,都可以立即执行


请参考libuv文档:

与Java相比,我还注意到许多关于Node.js性能的激进观点。从排队论的角度来看,我怀疑没有阻塞的单个线程如何能够比阻塞的多个线程执行得更好。我想,我会对Node.js与一种更成熟的技术相比表现如何进行自己的研究

我通过在Node.js和DropWizard/Java中编写功能相同的多数据源微服务来评估Node.js,然后对这两个实现进行相同的负载测试。我收集了两次测试结果的性能度量,并分析了数据

与DropWizard相比,Node.js只有代码大小的五分之一,具有相当的延迟和16%的吞吐量


我可以看到Node.js是如何在早期初创公司中流行起来的。与Java相比,在Node.js中快速编写微服务并使其运行更容易。随着公司的成熟,他们的重点往往从寻找适合的产品/市场转向提高规模经济。这或许可以解释为什么越来越多的老牌公司更喜欢具有更高可扩展性的Java。

您从哪里知道它有任何性能优势,更不用说“实质性”优势了?@EJP例如,在某些情况下,有报道称,和。一些激进的观点认为J2EE将完全被Javascript+JSON服务所取代()谢谢。该应用程序可以初始化多个并行IO任务,但这不是问题所在。我担心的是,在HTTP模式下,它必须等待所有后端完成响应,然后才能处理另一个请求
while(new Date().getTime() < now + 1000) {
   // do nothing
}