Why making dbus call from gjs is significantly slower than dbus-send

Using Print From Gio.DBus.session.call , The function I am using to make dbus calls from gjs is:

#!/usr/bin/env gjs

const { GLib, Gio } = imports.gi;

const connection = Gio.DBus.session;

const loop = new GLib.MainLoop(null, false);

const sourceId = GLib.timeout_add_seconds(
    GLib.PRIORITY_DEFAULT,
    1,
    () => {
            connection.call(
            'org.gnome.Shell',
            '/org/gnome/Shell/Extensions/GnomeUtilsWorkspaces',
            'org.gnome.Shell.Extensions.GnomeUtilsWorkspaces',
            'GetWorkspaces',
            null,
            null,
            Gio.DBusCallFlags.NONE,
            -1,
            null,
            (connection, res) => {
                try {
                    const reply = connection.call_finish(res);
                    const [string] = reply.recursiveUnpack();
                    print(string);
                } catch (e) {
                    if (e instanceof Gio.DBusError)
                        Gio.DBusError.strip_remote_error(e);

                    logError(e);
                } finally {
                    // so it definitely quits
                    loop.quit();
                }

            }

        )
    }
);

loop.run();

However, this is significantly slower than the dbus-send command.


$ time dbus-send --print-reply=literal --session --dest=org.gnome.Shell /org/gnome/Shell/Extensions/GnomeUtilsWorkspaces org.gnome.Shell.Extensions.GnomeUtilsWorkspaces.GetWorkspaces
   {"workspace_names":["Nemo","Firefox","Codium","Terminals","Books","Notes"],"number_of_workspaces":6,"current_workspace":"Nemo","all_windows_of_workspaces":{"Nemo":[3694756314,3694756035,3694756034,3694756353,3694756364],"Firefox":[3694756034],"Codium":[3694756034],"Terminals":[3694756034],"Books":[3694756034],"Notes":[3694756034]},"all_normal_windows_of_workspaces":{"Nemo":[3694756314,3694756035,3694756353,3694756364],"Firefox":[],"Codium":[],"Terminals":[],"Books":[],"Notes":[]}}
________________________________________________________
Executed in    4.17 millis    fish           external
   usr time    2.82 millis  249.00 micros    2.57 millis
   sys time    0.09 millis   93.00 micros    0.00 millis

…ian-i5/home/ismail/Desktop(0(1)1-fish(1))
$ time ./dbus_gjs
{"workspace_names":["Nemo","Firefox","Codium","Terminals","Books","Notes"],"number_of_workspaces":6,"current_workspace":"Nemo","all_windows_of_workspaces":{"Nemo":[3694756314,3694756035,3694756034,3694756353,3694756364],"Firefox":[3694756034],"Codium":[3694756034],"Terminals":[3694756034],"Books":[3694756034],"Notes":[3694756034]},"all_normal_windows_of_workspaces":{"Nemo":[3694756314,3694756035,3694756353,3694756364],"Firefox":[],"Codium":[],"Terminals":[],"Books":[],"Notes":[]}}

________________________________________________________
Executed in    1.09 secs      fish           external
   usr time   48.35 millis  718.00 micros   47.63 millis
   sys time    8.91 millis  255.00 micros    8.66 millis

4ms vs 1sec.

How can i increase the performance of this code?

const sourceId = GLib.timeout_add_seconds(
    GLib.PRIORITY_DEFAULT,
    1,
    () => {
});

The timeout code here is unnecessary, and certainly adding to the run time (one second, as it turns out :wink:).

Aside from that, you’re competing with a compiled program which serves one particular purpose, so I would be surprised if you’re ultimately able to beat it.

1 Like

Thank you very much.

1 Like

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.