NetworkManager/shared/nm-glib-aux
Thomas Haller 04d0d1bbe5 shared: add nm_utils_get_next_realloc_size() helper
When growing a buffer by appending a previously unknown number
of elements, the often preferable strategy is growing it exponentially,
so that the amortized runtime and re-allocation costs scale linearly.
GString just always increases the buffer length to the next power of
two. That works.

I think there is value in trying to find an optimal next size. Because
while it doesn't matter in terms of asymptotic behavior, in practice
a better choice should make a difference. This is inspired by what QT
does ([1]), to take more care when growing the buffers:

  - QString allocates 4 characters at a time until it reaches size 20.
  - From 20 to 4084, it advances by doubling the size each time. More
    precisely, it advances to the next power of two, minus 12. (Some memory
    allocators perform worst when requested exact powers of two, because
    they use a few bytes per block for book-keeping.)
  - From 4084 on, it advances by blocks of 2048 characters (4096 bytes).
    This makes sense because modern operating systems don't copy the entire
    data when reallocating a buffer; the physical memory pages are simply
    reordered, and only the data on the first and last pages actually needs
    to be copied.

Note that a QT is talking about 12 characters, so we use 24 bytes
head room.

[1] https://doc.qt.io/qt-5/containers.html#growth-strategies
2020-04-03 11:31:12 +02:00
..
tests shared: add nm_utils_get_next_realloc_size() helper 2020-04-03 11:31:12 +02:00
nm-c-list.h shared: add nm_c_list_for_each_entry_prev() helper macro 2019-10-18 22:09:18 +02:00
nm-dbus-aux.c shared: allow nm_dbus_connection_call_finish_variant_cb() with D-Bus methods that have no return value 2020-03-23 09:32:04 +01:00
nm-dbus-aux.h shared: add nm_dbus_connection_call_set() util 2020-02-10 19:11:50 +01:00
nm-dedup-multi.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-dedup-multi.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-enum-utils.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-enum-utils.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-errno.c shared: drop _STATIC variant of macros that define functions 2020-02-13 17:17:07 +01:00
nm-errno.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-glib.h license: relicense "shared/nm-glib-aux/nm-glib.h" under LGPL-2.1+ 2020-02-16 15:41:36 +01:00
nm-hash-utils.c shared: cleanup _get_hash_key_init() and better explain the reasoning 2020-04-03 11:26:49 +02:00
nm-hash-utils.h shared: cleanup _get_hash_key_init() and better explain the reasoning 2020-04-03 11:26:49 +02:00
nm-io-utils.c shared: use nm_secret_mem_try_realloc_take() in nm_utils_fd_get_contents() 2020-04-03 11:31:12 +02:00
nm-io-utils.h shared: add io-util to read data from a fd into a GString 2019-12-24 10:13:51 +01:00
nm-jansson.h license: relicense "shared/nm-glib-aux/nm-jansson.h" under LGPL-2.1+ 2020-02-16 15:41:40 +01:00
nm-json-aux.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-json-aux.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-keyfile-aux.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-keyfile-aux.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-logging-base.c shared: move log level info from core to "nm-logging-base.h" 2019-11-28 19:20:33 +01:00
nm-logging-base.h shared: move log level info from core to "nm-logging-base.h" 2019-11-28 19:20:33 +01:00
nm-logging-fwd.h shared: add LOGD_DHCP_from_addr_family() helper 2020-02-17 14:45:09 +01:00
nm-macros-internal.h shared: add NM_SWAP() macro 2020-03-26 21:28:56 +01:00
nm-obj.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-random-utils.c all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-random-utils.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00
nm-ref-string.c shared: assert in nm_ref_string_unref() for valid NMRefString instance 2019-11-07 11:34:36 +01:00
nm-ref-string.h shared: fix handling %NULL argument in nm_ref_string_equals_str() 2020-03-02 15:49:41 +01:00
nm-secret-utils.c shared: use G_UNLIKELY() macro for unlikely branch in nm_explicit_bzero() 2020-04-03 11:31:12 +02:00
nm-secret-utils.h shared: add nm_secret_mem_realloc() helpers 2020-04-03 11:31:12 +02:00
nm-shared-utils.c shared: add nm_utils_get_next_realloc_size() helper 2020-04-03 11:31:12 +02:00
nm-shared-utils.h shared: add nm_utils_get_next_realloc_size() helper 2020-04-03 11:31:12 +02:00
nm-time-utils.c shared/trivial: rename time related functions to use "nsec"/"msec" abbreviation instead of "ns"/"ms" 2020-02-10 19:11:50 +01:00
nm-time-utils.h shared: add nm_utils_get_monotonic_timestamp_msec_cached() helper 2020-02-10 19:11:50 +01:00
nm-value-type.h all: unify format of our Copyright source code comments 2019-10-02 17:03:52 +02:00