NetworkManager/src
Thomas Haller d9bb13f8e3 ifcfg-rh: add index for O(1) access of variables in shvarFile
Previously, setting or getting a variable required to scan all lines.

Note that frequently we would look up variables that didn't actually
exist, which we could only determine after searching the entire list.

Also, since we needed to handle having the same variable specified
multiple times (where the last occurrence wins), we always had to search
all keys and couldn't stop when finding the first key. Well, technically
we could have searched in reverse order for the getter, but that wasn't
done. For the setter we wanted to delete all but the last occurrences,
so to find them, we really had to search them all.

We want to support profiles with hundreds or thousands of addresses and routes.
This does not scale well.

Add an hash table to find the variables in constant time.

Test this commit and the parent commit:

   $ git clean -fdx &&
     CFLAGS=-O2 ./autogen.sh --with-more-asserts=0 &&
     ./tools/run-nm-test.sh -m src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh &&
     perf stat -r 50 -B src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh 1>/dev/null

Before:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            330.94 msec task-clock:u              #    0.961 CPUs utilized            ( +-  0.33% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,081      page-faults:u             #    0.003 M/sec                    ( +-  0.07% )
     1,035,923,116      cycles:u                  #    3.130 GHz                      ( +-  0.29% )
     1,800,084,022      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       362,313,301      branches:u                # 1094.784 M/sec                    ( +-  0.02% )
         6,259,421      branch-misses:u           #    1.73% of all branches          ( +-  0.13% )

           0.34454 +- 0.00116 seconds time elapsed  ( +-  0.34% )

Now:

 Performance counter stats for 'src/settings/plugins/ifcfg-rh/tests/test-ifcfg-rh' (50 runs):

            329.78 msec task-clock:u              #    0.962 CPUs utilized            ( +-  0.39% )
                 0      context-switches:u        #    0.000 K/sec
                 0      cpu-migrations:u          #    0.000 K/sec
             1,084      page-faults:u             #    0.003 M/sec                    ( +-  0.05% )
     1,036,130,698      cycles:u                  #    3.142 GHz                      ( +-  0.13% )
     1,799,851,979      instructions:u            #    1.74  insn per cycle           ( +-  0.01% )
       360,374,338      branches:u                # 1092.756 M/sec                    ( +-  0.01% )
         6,160,796      branch-misses:u           #    1.71% of all branches          ( +-  0.08% )

           0.34287 +- 0.00133 seconds time elapsed  ( +-  0.39% )

So, not much difference. But this is not surprising, because test-ifcfg-rh loads and
writes predominantly ifcfg files with few variables. The difference should be visible
when having large files.
2019-12-21 12:56:23 +01:00
..
devices core: add and indicate NM_CAPABILITY_OVS capability on D-Bus 2019-12-21 11:33:59 +01:00
dhcp dhcp: nettools: check return value of g_file_set_contents() 2019-12-18 10:02:48 +01:00
dns all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
dnsmasq meson: Improve the src build file 2019-10-01 09:49:33 +02:00
initrd initrd: don't use inet_aton() to parse IPv4 address 2019-12-05 12:36:13 +01:00
ndisc all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
platform all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
ppp all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
settings ifcfg-rh: add index for O(1) access of variables in shvarFile 2019-12-21 12:56:23 +01:00
supplicant all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
systemd systemd: merge branch systemd into master 2019-12-16 10:22:09 +01:00
tests all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
vpn all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
main-utils.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
main-utils.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
main.c config: print config warnings during NetworkManager --print-config 2019-12-11 11:52:05 +01:00
meson.build meson: Improve the src build file 2019-10-01 09:49:33 +02:00
NetworkManagerUtils.c utils: alow matching ipv6 new method 'disable' 2019-11-18 11:07:18 +01:00
NetworkManagerUtils.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-act-request.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-act-request.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-active-connection.c core: don't use pointer value for pending action string in active-connection 2019-10-14 16:37:16 +02:00
nm-active-connection.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-audit-manager.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-audit-manager.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-auth-manager.c core: add main.auth-polkit option "root-only" 2019-12-11 11:52:05 +01:00
nm-auth-manager.h core: add main.auth-polkit option "root-only" 2019-12-11 11:52:05 +01:00
nm-auth-subject.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-auth-subject.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-auth-utils.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-auth-utils.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-checkpoint-manager.c all: use nm_dbus_path_not_empty() 2019-11-07 11:34:36 +01:00
nm-checkpoint-manager.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-checkpoint.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-checkpoint.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-config-data.c config: emit warning about invalid main.auth-polkit setting 2019-12-11 11:52:05 +01:00
nm-config-data.h config: add nm_config_data_get_warnings() to get additional warnings about wrong configuration 2019-12-11 11:52:05 +01:00
nm-config.c config: add nm_config_data_get_warnings() to get additional warnings about wrong configuration 2019-12-11 11:52:05 +01:00
nm-config.h core: add main.auth-polkit option "root-only" 2019-12-11 11:52:05 +01:00
nm-connectivity.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-connectivity.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-core-utils.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-core-utils.h core: remove 'legacy_unstable_byteorder' argument from client-id helpers 2019-12-02 17:50:40 +01:00
nm-dbus-manager.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-dbus-manager.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dbus-object.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-dbus-object.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-dbus-utils.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-dbus-utils.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-dcb.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dcb.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dhcp4-config.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dhcp4-config.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dhcp6-config.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dhcp6-config.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dispatcher.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-dispatcher.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-firewall-manager.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-firewall-manager.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-hostname-manager.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-hostname-manager.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-iface-helper.c dhcp: support FQDN flags in the dhclient backend 2019-11-28 17:56:35 +01:00
nm-ip4-config.c all: add support for "scope" attribute for IPv4 routes 2019-11-28 00:11:15 +01:00
nm-ip4-config.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-ip6-config.c core: don't add prefix route for external addresses 2019-10-23 21:46:26 +02:00
nm-ip6-config.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-keep-alive.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-keep-alive.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-logging.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-logging.h core: move _LOG*() macros to "shared/nm-glib-aux/nm-logging-fwd.h" 2019-11-22 15:32:52 +01:00
nm-manager.c core: add and indicate NM_CAPABILITY_OVS capability on D-Bus 2019-12-21 11:33:59 +01:00
nm-manager.h manager: don't activate device if the parent is missing 2019-11-25 08:58:27 +01:00
nm-netns.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-netns.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-pacrunner-manager.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-pacrunner-manager.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-policy.c all: rename time related function to spell out nsec/usec/msec/sec 2019-12-13 16:54:40 +01:00
nm-policy.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-proxy-config.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-proxy-config.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-rfkill-manager.c all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-rfkill-manager.h all: manually drop code comments with file description 2019-10-01 07:50:52 +02:00
nm-session-monitor.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-session-monitor.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-sleep-monitor.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-sleep-monitor.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-test-utils-core.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-types.h core: track whether IP addresses are external 2019-10-23 17:44:38 +02:00
org.freedesktop.NetworkManager.conf wifi-p2p: rename Wi-Fi P2P 2019-02-01 17:02:57 +01:00