git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH 00/10] typed sort of linked lists

From
René Scharfe <l.s.r@web.de>
Date
Jul 16, 2022, 16:50 UTC
Message-ID
<4d7cd286-398e-215c-f2bd-aa7e8207be4f@web.de>

llist_mergesort() is a function for sorting linked lists of any type without any dynamic memory allocation. It just requires the programmer to define two accessor functions and doesn't need an embedded struct or magic next pointer placement, which makes it relatively easy to use.

These accessor functions impose function call overhead and a barrier to type checking. This series aims to avoid that by giving the compiler full type information and allow it to inline them. Programmers don't need to write the accessor functions anymore and get to use typed comparison functions -- no more casts from void *. Sorting gets a bit quicker. The cost: Increased binary size.

It starts by making llist_mergesort() leaner without reducing its performance:

  mergesort: unify ranks loops
  mergesort: tighten merge loop

This matters for the next step, which creates the macro version of that function:

  mergesort: add macros for typed sort of linked lists

The next two patches show the impact of using the macro on performance and object text size of the test helper:

  test-mergesort: use DEFINE_LIST_SORT_DEBUG
  test-mergesort: use DEFINE_LIST_SORT
Then all llist_mergesort() callers get converted:
  blame: use DEFINE_LIST_SORT
  commit: use DEFINE_LIST_SORT
  fetch-pack: use DEFINE_LIST_SORT
  packfile: use DEFINE_LIST_SORT
... and the final patch removes the function which has become unused:
  mergesort: remove llist_mergesort()
 Makefile                  |   1 -
 blame.c                   |  30 ++++-------
 commit.c                  |  20 +++----
 fetch-pack.c              |   8 +++
 mergesort.c               |  84 -----------------------------
 mergesort.h               | 108 ++++++++++++++++++++++++++++++++++----
 packfile.c                |  18 ++-----
 remote.c                  |  22 --------
 remote.h                  |   2 -
 t/helper/test-mergesort.c |  34 +++---------
 t/perf/p0071-sort.sh      |   4 +-
 t/t0071-sort.sh           |   2 +-
 12 files changed, 134 insertions(+), 199 deletions(-)
 delete mode 100644 mergesort.c

-- 2.37.1

Next: René Scharfe
Message 1 of 15 in “typed sort of linked lists”
  1. 00/10 typed sort of linked listsRené Scharfe, Jul 16, 2022
  2. 01/10 mergesort: unify ranks loopsRené Scharfe, Jul 16, 2022
  3. 02/10 mergesort: tighten merge loopRené Scharfe, Jul 16, 2022
  4. 03/10 mergesort: add macros for typed sort of linked listsRené Scharfe, Jul 16, 2022
  5. 04/10 test-mergesort: use DEFINE_LIST_SORT_DEBUGRené Scharfe, Jul 16, 2022
  6. 05/10 test-mergesort: use DEFINE_LIST_SORTRené Scharfe, Jul 16, 2022
  7. 06/10 blame: use DEFINE_LIST_SORTRené Scharfe, Jul 16, 2022
  8. 07/10 commit: use DEFINE_LIST_SORTRené Scharfe, Jul 16, 2022
  9. 08/10 fetch-pack: use DEFINE_LIST_SORTRené Scharfe, Jul 16, 2022
  10. 09/10 packfile: use DEFINE_LIST_SORTRené Scharfe, Jul 16, 2022
  11. 10/10 mergesort: remove llist_mergesort()René Scharfe, Jul 16, 2022
  12. Junio C HamanoJul 17, 2022
  13. Junio C HamanoJul 25, 2022
  14. Derrick StoleeJul 25, 2022
  15. Junio C HamanoJul 25, 2022

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.