Node.js NodeJS聊天应用程序比Java慢的原因是什么?

Node.js NodeJS聊天应用程序比Java慢的原因是什么?,node.js,mongodb,socket.io,jmeter,performance-testing,Node.js,Mongodb,Socket.io,Jmeter,Performance Testing,我是Node js新手,我用Node js(使用socket.io库和express)和Java(来自Javalin.io库的websockets)中的Mongodb构建了一个非常简单的群组聊天应用程序。它们基本上做相同的事情,因此我希望NodeJS one比Java one更快,因为这可能是实时和基于I/O的应用程序的最佳示例 然而,使用JMeter测试应用程序(5秒内有N个请求)表明,对于较低的N(50-100),Node js应用程序稍微慢一点,对于较高的N(400),变得更慢 我正在测试

我是Node js新手,我用Node js(使用socket.io库和express)和Java(来自Javalin.io库的websockets)中的Mongodb构建了一个非常简单的群组聊天应用程序。它们基本上做相同的事情,因此我希望NodeJS one比Java one更快,因为这可能是实时和基于I/O的应用程序的最佳示例

然而,使用JMeter测试应用程序(5秒内有N个请求)表明,对于较低的N(50-100),Node js应用程序稍微慢一点,对于较高的N(400),变得更慢

我正在测试的请求是对api的HTTP请求,返回包含mongodb中所有消息的Json数组:

app.all('/chats', function (req, res) {
res.setHeader("Content-Type", "application/json");
res.statusCode = 200;

thechatsCollection.find({}).toArray ( (err, chats) => {
    var jsonArr = [];
    for (var i = 0; i < chats.length; i++) {
        jsonArr.push({
        sender: chats[i].sender,
        message: chats[i].message,
        createdAt: chats[i].createdAt
        });
    }
    res.json(jsonArr);
    });
});
此外,我注意到第二次运行测试会导致响应时间的平均值降低,我认为这是由于连接到db的连接池增加了,所以我尝试在打开db连接时设置poolSize参数(设置为10,20,50100),但这通常会使速度变慢

聊天应用程序的node js实现是否可能比java应用程序慢?这可能是什么原因?我写异步部分错了吗

rest请求的Java实现:

app.get("/chats", ctx -> {
        JSONArray messageArray = getMessageArray();
        ctx.contentType("application/json");
        ctx.result(messageArray.toString());
    });

// Builds a JSON array containing all the messages in the db
private static JSONArray getMessageArray() {
    JSONArray messageArray = new JSONArray();
    for (Document doc : thechatsCollection.find()) {
        JSONObject message = new JSONObject();
        message.put("message", doc.get("message"));
        message.put("sender", doc.get("sender"));
        message.put("createdAt", doc.get("createdAt"));
        messageArray.put(message);
    }
    return messageArray;
}
我尝试使用内置的
--prof
进行评测,调用
ab-c20-n250“http://localhost:5000/chats“
,一次应执行250个请求20个,并使用
--prof process
处理文件,我得到的结果如下:

 [Summary]:
   ticks  total  nonlib   name
    606    2.2%   78.3%  JavaScript
      0    0.0%    0.0%  C++
    298    1.1%   38.5%  GC
  26331   97.1%          Shared libraries
    168    0.6%          Unaccounted
 [Shared libraries]:
   ticks  total  nonlib   name
  23282   85.9%          C:/Windows/SYSTEM32/ntdll.dll
   3026   11.2%          C:/Program Files/nodejs/node.exe
...
 [JavaScript]:
   ticks  total  nonlib   name
    122    0.5%   15.8%  LazyCompile: *deserializeObject C:/Users/apon9/OneDrive/Node js/chatApplication_nodejs/node_modules/bson/lib/bson/parser/deserializer.js:41:33
     82    0.3%   10.6%  Builtin: KeyedStoreIC_Megamorphic
     35    0.1%    4.5%  Builtin: InterpreterEntryTrampoline
...
C:/Program Files/Nodejs/Node.exe对我来说似乎合理,但我不知道
C:/Windows/SYSTEM32/ntdll.dll
是否应该以86%的比例存在,可能与内核相关

反序列化对象如何?我的代码在任何方面都可以优化吗?

node显然很快,具有异步机制和非阻塞IOs(就像您的MongoDB查询一样),使用同步代码Java可以击败JS

首先,在没有Java源代码的情况下,JS使用的是
push
,这是同步的。根据消息的数量,它可能已经花费了相当长的时间(1M推送可能需要~20ms),并将其乘以50并发,这将成为一个问题)

其次,至于为什么较大的池速度较慢,这可能是因为MongoClient池正在延迟初始化连接,这意味着只在每个连接的第一次查询时初始化连接。对于更大的池,首先需要初始化更多的连接。例如,池大小为100时,前100个查询将很慢,因为这些查询将等待连接建立。但是随后,池大小为100的池应该能够在高并发性下提供较低的平均响应时间


因此,与Java相比,尤其是您的实现。如果您的实现没有使用
push
,并且您的Mongo客户端在池初始化期间主动创建连接,那么您的Java很可能能够击败这个JS实现,特别是在早期请求期间。

此rest请求的Java实现是什么样子的?添加了Java实现1)推送是如何同步操作的?向数组中添加项的异步方式是什么?2) 有没有办法以一种急切的方式而不是懒惰的方式初始化连接池的连接?设置
poolSize
的目的是什么?没有异步方式添加到数组中,如果这样做,也不会更快。关键在于你的代码在这里做了一些数学运算,构建了这些数组,而Java可能会更快。可能是,因为它是强类型的。但这真的是时间的方向吗?没有人真正知道,也没有人会知道,直到你开始分析代码。哦,谢谢,我现在明白了。我刚刚尝试使用内置的探查器评测我的node js应用程序,但我遇到了一些问题。。。如果你有任何想法的话,我会马上编辑这篇文章
 [Summary]:
   ticks  total  nonlib   name
    606    2.2%   78.3%  JavaScript
      0    0.0%    0.0%  C++
    298    1.1%   38.5%  GC
  26331   97.1%          Shared libraries
    168    0.6%          Unaccounted
 [Shared libraries]:
   ticks  total  nonlib   name
  23282   85.9%          C:/Windows/SYSTEM32/ntdll.dll
   3026   11.2%          C:/Program Files/nodejs/node.exe
...
 [JavaScript]:
   ticks  total  nonlib   name
    122    0.5%   15.8%  LazyCompile: *deserializeObject C:/Users/apon9/OneDrive/Node js/chatApplication_nodejs/node_modules/bson/lib/bson/parser/deserializer.js:41:33
     82    0.3%   10.6%  Builtin: KeyedStoreIC_Megamorphic
     35    0.1%    4.5%  Builtin: InterpreterEntryTrampoline
...