Skip to content

about EventLoop performance #884

Description

@f5qiang

I saw "qodejs/README" write:
When a Gui message loop is injected, qode will use it as the primary event loop and will process NodeJs requests on the main thread as an when it arrives by listening to the libuv's events.

I write UDP communication example, repeated bounce between server/client, test event-loop performance difference, like this:

Clinet -> Server -> Client -> Server ...

example code: index.ts

import { QMainWindow, QWidget, QLabel, FlexLayout, QPushButton, QIcon } from '@nodegui/nodegui';
import logo from '../assets/logox200.png';
const win = new QMainWindow();
win.setWindowTitle("Hello World");

const centralWidget = new QWidget();
centralWidget.setObjectName("myroot");
const rootLayout = new FlexLayout();
centralWidget.setLayout(rootLayout);

const button = new QPushButton();
button.setIcon(new QIcon(logo));
rootLayout.addWidget(button);
win.setCentralWidget(centralWidget);

win.show();
(global as any).win = win;

//---------------------------------------------------------
// UDP Test

const net = require('net')

let qps = 0
let start = new Date()
let UDP_PORT = 9022
let strmsg = "";
let strlen = 1024*1;       // 1KB
for( let i = 0; i < strlen; i ++ ) {
  strmsg += "0"
}
let message = Buffer.from(strmsg);

//------------------------
// UDP Server
import dgram = require("dgram");
const udp_server = dgram.createSocket("udp4");

udp_server.on("message", (msg:Buffer, rinfo:dgram.RemoteInfo) => {
    udp_server.send( message, rinfo.port, rinfo.address )

    let now = new Date()
    if( now.getTime() - start.getTime() >= 1000 ) {
        console.log( "qps: %s", qps )
        start = now
        qps = 0
    }
    qps ++;
});

udp_server.on('error', (err:Error) => {
    udp_server.close();
})

udp_server.on("listening", () => {
    let address = udp_server.address();
});

//------------------------
// UDP Client
const udp_client = dgram.createSocket('udp4');

udp_client.on("message", (msg:Buffer, rinfo:dgram.RemoteInfo) => {
    udp_client.send( msg, UDP_PORT, "127.0.0.1" )
});

udp_server.bind(UDP_PORT, () => {});

The difference in results is enormous, on my laptop (Macbook/M1/arm64):
default node.js: "qps" 5w-6w (comment out the lines above)
after use node-gui: "qps" 2w-3w

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions