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

Re: [PATCH 0/5] Add struct strmap and associated utility functions

From
Elijah Newren <newren@gmail.com>
Date
Aug 21, 2020, 22:28 UTC
Message-ID
<CABPp-BFFOKcBsPEu+zueCKwPGMh9RgOE8QJonKxkNNE3-Ym7Gw@mail.gmail.com>
In-Reply-To
<CABPp-BGYiphp-93Bf=2z-ZLd-Y=buTA0BCp6zuTJF39n1x3Rfw@mail.gmail.com>
On Fri, Aug 21, 2020 at 2:33 PM Elijah Newren <newren@gmail.com> wrote:
Show 54 quoted lines
>
> On Fri, Aug 21, 2020 at 1:16 PM Jeff King <peff@peff.net> wrote:
> >
> > On Fri, Aug 21, 2020 at 06:52:24PM +0000, Elijah Newren via GitGitGadget wrote:
> >
> > > Here I introduce a new strmap type, which my new merge backed, merge-ort,
> > > uses heavily. (I also made significant use of it in my changes to
> > > diffcore-rename). This strmap type was based on Peff's proposal from a
> > > couple years ago[1], but has additions that I made as I used it. I also
> > > start the series off with a quick documentation improvement to hashmap.c to
> > > differentiate between hashmap_free() and hashmap_free_entries(), since I
> > > personally had difficulty understanding them and it affects how
> > > strmap_clear()/strmap_free() are written.
> >
> > I like the direction overall (unsurprisingly), but left a bunch of
> > comments. I do think if we're going to do this that it may be worth
> > cleaning up hashmap a bit first, especially around its clear/free
> > semantics, and its ability to lazy-allocate the table.
> >
> > I'm happy to work on that, but don't want to step on your toes.
>
> I have patches which introduce hashmap_clear() and
> hashmap_clear_entries() to hashmap.[ch], which allowed me to simplify
> strmap_clear(); instead of needing to call both
> hashmap_free[_entries]() && strmap_init(), I could just call
> hashmap_clear[_entries]().  Doing that surprised me with a significant
> performance impact (in a good direction), at which point I started
> adding mem-pool integration into hashmap for storing the entries that
> hashmap.c allocates and got further good speedups.
>
> I thought those were better explained when I got to the performance
> stuff, so I had held off on those patches.  I could pull them out and
> submit them first.
>
> However, there's an important difference here between what I've done
> and what you've suggested for hashmap: my method did not deallocate
> hashmap->table in hashmap_clear() and then use lazy initialization.
> In fact, I think not deallocating the table was part of the charm --
> the table had already naturally grown to the right size, and because
> the repository has approximately the same number of paths in various
> commits, this provided me a way of getting a table preallocated to a
> reasonable size for all merges after the first (and there are multiple
> merges either when recursiveness is needed due to multiple merge
> bases, OR when rebasing or cherry-picking a sequence of commits).
> This prevented, as hashmap.h puts it, "expensive resizing".
>
> So, once again, my performance ideas might be clashing with some of
> your desires for the API.  Any clever ideas for resolving that?
>
> Also, since you want to see hashmap cleanup first, should I submit
> just the hashmap_clear[_entries()] stuff, or should I also submit the
> API additions to allow mem-pool integration in hashmap (it's pretty
> small and self-contained, but it'll be a while before I submit the
> patches that use it...)?

Nevermind, I mis-remembered. The mempool integration was added specifically to strmap, not to hashmap, because strmap_put() does the allocation of the str_entry. So I'll just pull out the hashmap_clear[_entries]() stuff and send it up.

Show 30 quoted lines
>
> > I also wonder if you looked at the khash stuff at all. Especially for
> > storing integers, it makes things much more natural. You'd do something
> > like:
> >
> >   /* you might even be able to just write !strcmp in the macro below */
> >   static inline int streq(const char *a, const char *b)
> >   {
> >           return !strcmp(a, b);
> >   }
> >
> >   KHASH_INIT(strint_map, char *, int, 1, strhash, streq);
> >
> > and then you'd probably want a "put" wrapper that makes a copy of the
> > string. khash has its own charming awkwardness, but I'm just curious if you
> > looked at it and found it more awkward than hashmap.c, or if you just
> > didn't look at it.
>
> I did look at it, but only briefly.  I had a further investigation on
> my TODO list for months, along with several other improvement ideas.
> But it seemed like my TODO list was really long, and my new merge
> backend hasn't benefited anyone yet.  At some point, I decided to punt
> on it and other ideas and start cleaning up my code and submitting.  I
> believe merge-ort is more accurate than merge-recursive (it fixes
> several test_expect_failures) and is a lot faster as well for the
> cases I'm looking at.  So, for now, I've pulled it off my radar.
>
> But I'd be really happy if someone else wanted to jump in and try
> switching out hashmap for khash in the strmap API and see if it helps
> merge-ort performance.  :-)
Previous: Elijah NewrenNext: Jeff King
Message 21 of 144 in “Add struct strmap and associated utility functions”
  1. 0/5 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Aug 21, 2020
  2. 3/5 strmap: add more utility functionsElijah Newren via GitGitGadget, Aug 21, 2020
  3. Jeff KingAug 21, 2020
  4. 1/5 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Aug 21, 2020
  5. Jeff KingAug 21, 2020
  6. 5/5 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Aug 21, 2020
  7. Jeff KingAug 21, 2020
  8. Elijah NewrenAug 21, 2020
  9. Jeff KingAug 21, 2020
  10. 2/5 strmap: new utility functionsElijah Newren via GitGitGadget, Aug 21, 2020
  11. Jeff KingAug 21, 2020
  12. 4/5 strmap: add strdup_strings optionElijah Newren via GitGitGadget, Aug 21, 2020
  13. Jeff KingAug 21, 2020
  14. Elijah NewrenAug 21, 2020
  15. Jeff KingAug 21, 2020
  16. Elijah NewrenAug 21, 2020
  17. Jeff KingAug 28, 2020
  18. Elijah NewrenAug 28, 2020
  19. Jeff KingAug 21, 2020
  20. Elijah NewrenAug 21, 2020
  21. Elijah NewrenAug 21, 2020
  22. Jeff KingAug 28, 2020
  23. Elijah NewrenAug 28, 2020
  24. Jeff KingSep 1, 2020
  25. 00/10 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Oct 13, 2020
  26. 01/10 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Oct 13, 2020
  27. Jeff KingOct 30, 2020
  28. Elijah NewrenOct 30, 2020
  29. Jeff KingNov 3, 2020
  30. Elijah NewrenNov 3, 2020
  31. 05/10 strmap: new utility functionsElijah Newren via GitGitGadget, Oct 13, 2020
  32. Jeff KingOct 30, 2020
  33. Elijah NewrenOct 30, 2020
  34. 04/10 hashmap: introduce a new hashmap_partial_clear()Elijah Newren via GitGitGadget, Oct 13, 2020
  35. Jeff KingOct 30, 2020
  36. Elijah NewrenOct 30, 2020
  37. Jeff KingNov 3, 2020
  38. 03/10 hashmap: allow re-use after hashmap_free()Elijah Newren via GitGitGadget, Oct 13, 2020
  39. Jeff KingOct 30, 2020
  40. Elijah NewrenOct 30, 2020
  41. Jeff KingNov 3, 2020
  42. Elijah NewrenNov 3, 2020
  43. 02/10 hashmap: adjust spacing to fix argument alignmentElijah Newren via GitGitGadget, Oct 13, 2020
  44. Jeff KingOct 30, 2020
  45. 07/10 strmap: enable faster clearing and reusing of strmapsElijah Newren via GitGitGadget, Oct 13, 2020
  46. Jeff KingOct 30, 2020
  47. 10/10 strmap: enable allocations to come from a mem_poolElijah Newren via GitGitGadget, Oct 13, 2020
  48. Jeff KingOct 30, 2020
  49. Elijah NewrenOct 30, 2020
  50. Jeff KingNov 3, 2020
  51. 06/10 strmap: add more utility functionsElijah Newren via GitGitGadget, Oct 13, 2020
  52. Jeff KingOct 30, 2020
  53. Elijah NewrenOct 30, 2020
  54. Jeff KingNov 3, 2020
  55. 08/10 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Oct 13, 2020
  56. Jeff KingOct 30, 2020
  57. Elijah NewrenOct 30, 2020
  58. Jeff KingNov 3, 2020
  59. Elijah NewrenNov 3, 2020
  60. 09/10 strmap: add a strset sub-typeElijah Newren via GitGitGadget, Oct 13, 2020
  61. Jeff KingOct 30, 2020
  62. Elijah NewrenOct 30, 2020
  63. 00/13 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Nov 2, 2020
  64. 01/13 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Nov 2, 2020
  65. 02/13 hashmap: adjust spacing to fix argument alignmentElijah Newren via GitGitGadget, Nov 2, 2020
  66. 04/13 hashmap: introduce a new hashmap_partial_clear()Elijah Newren via GitGitGadget, Nov 2, 2020
  67. 03/13 hashmap: allow re-use after hashmap_free()Elijah Newren via GitGitGadget, Nov 2, 2020
  68. 05/13 hashmap: provide deallocation function namesElijah Newren via GitGitGadget, Nov 2, 2020
  69. 09/13 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Nov 2, 2020
  70. Jeff KingNov 4, 2020
  71. 11/13 strmap: enable allocations to come from a mem_poolElijah Newren via GitGitGadget, Nov 2, 2020
  72. 10/13 strmap: add a strset sub-typeElijah Newren via GitGitGadget, Nov 2, 2020
  73. Jeff KingNov 4, 2020
  74. 13/13 Use new HASHMAP_INIT macro to simplify hashmap initializationElijah Newren via GitGitGadget, Nov 2, 2020
  75. Jeff KingNov 4, 2020
  76. 07/13 strmap: add more utility functionsElijah Newren via GitGitGadget, Nov 2, 2020
  77. Jeff KingNov 4, 2020
  78. Elijah NewrenNov 4, 2020
  79. 08/13 strmap: enable faster clearing and reusing of strmapsElijah Newren via GitGitGadget, Nov 2, 2020
  80. 06/13 strmap: new utility functionsElijah Newren via GitGitGadget, Nov 2, 2020
  81. 12/13 strmap: take advantage of FLEXPTR_ALLOC_STR when relevantElijah Newren via GitGitGadget, Nov 2, 2020
  82. Jeff KingNov 4, 2020
  83. Jeff KingNov 4, 2020
  84. Elijah NewrenNov 4, 2020
  85. 00/13 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Nov 5, 2020
  86. 13/13 Use new HASHMAP_INIT macro to simplify hashmap initializationElijah Newren via GitGitGadget, Nov 5, 2020
  87. 11/13 strmap: enable allocations to come from a mem_poolElijah Newren via GitGitGadget, Nov 5, 2020
  88. 10/13 strmap: add a strset sub-typeElijah Newren via GitGitGadget, Nov 5, 2020
  89. 12/13 strmap: take advantage of FLEXPTR_ALLOC_STR when relevantElijah Newren via GitGitGadget, Nov 5, 2020
  90. 07/13 strmap: add more utility functionsElijah Newren via GitGitGadget, Nov 5, 2020
  91. 06/13 strmap: new utility functionsElijah Newren via GitGitGadget, Nov 5, 2020
  92. 09/13 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Nov 5, 2020
  93. 08/13 strmap: enable faster clearing and reusing of strmapsElijah Newren via GitGitGadget, Nov 5, 2020
  94. 04/13 hashmap: introduce a new hashmap_partial_clear()Elijah Newren via GitGitGadget, Nov 5, 2020
  95. 05/13 hashmap: provide deallocation function namesElijah Newren via GitGitGadget, Nov 5, 2020
  96. 02/13 hashmap: adjust spacing to fix argument alignmentElijah Newren via GitGitGadget, Nov 5, 2020
  97. 03/13 hashmap: allow re-use after hashmap_free()Elijah Newren via GitGitGadget, Nov 5, 2020
  98. 01/13 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Nov 5, 2020
  99. Jeff KingNov 5, 2020
  100. Junio C HamanoNov 5, 2020
  101. Jeff KingNov 5, 2020
  102. Elijah NewrenNov 5, 2020
  103. Junio C HamanoNov 5, 2020
  104. 00/15 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Nov 6, 2020
  105. 01/15 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Nov 6, 2020
  106. 02/15 hashmap: adjust spacing to fix argument alignmentElijah Newren via GitGitGadget, Nov 6, 2020
  107. 04/15 hashmap: introduce a new hashmap_partial_clear()Elijah Newren via GitGitGadget, Nov 6, 2020
  108. 03/15 hashmap: allow re-use after hashmap_free()Elijah Newren via GitGitGadget, Nov 6, 2020
  109. 10/15 strmap: split create_entry() out of strmap_put()Elijah Newren via GitGitGadget, Nov 6, 2020
  110. 11/15 strmap: add a strset sub-typeElijah Newren via GitGitGadget, Nov 6, 2020
  111. 05/15 hashmap: provide deallocation function namesElijah Newren via GitGitGadget, Nov 6, 2020
  112. 13/15 strmap: take advantage of FLEXPTR_ALLOC_STR when relevantElijah Newren via GitGitGadget, Nov 6, 2020
  113. 06/15 strmap: new utility functionsElijah Newren via GitGitGadget, Nov 6, 2020
  114. 09/15 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Nov 6, 2020
  115. 08/15 strmap: enable faster clearing and reusing of strmapsElijah Newren via GitGitGadget, Nov 6, 2020
  116. 12/15 strmap: enable allocations to come from a mem_poolElijah Newren via GitGitGadget, Nov 6, 2020
  117. Phillip WoodNov 11, 2020
  118. Elijah NewrenNov 11, 2020
  119. Jeff KingNov 11, 2020
  120. Chris TorekNov 11, 2020
  121. 07/15 strmap: add more utility functionsElijah Newren via GitGitGadget, Nov 6, 2020
  122. 15/15 shortlog: use strset from strmap.hElijah Newren via GitGitGadget, Nov 6, 2020
  123. 14/15 Use new HASHMAP_INIT macro to simplify hashmap initializationElijah Newren via GitGitGadget, Nov 6, 2020
  124. Junio C HamanoNov 6, 2020
  125. Elijah NewrenNov 6, 2020
  126. Jeff KingNov 6, 2020
  127. Junio C HamanoNov 6, 2020
  128. 00/15 Add struct strmap and associated utility functionsElijah Newren via GitGitGadget, Nov 11, 2020
  129. 02/15 hashmap: adjust spacing to fix argument alignmentElijah Newren via GitGitGadget, Nov 11, 2020
  130. 01/15 hashmap: add usage documentation explaining hashmap_free[_entries]()Elijah Newren via GitGitGadget, Nov 11, 2020
  131. 03/15 hashmap: allow re-use after hashmap_free()Elijah Newren via GitGitGadget, Nov 11, 2020
  132. 06/15 strmap: new utility functionsElijah Newren via GitGitGadget, Nov 11, 2020
  133. 05/15 hashmap: provide deallocation function namesElijah Newren via GitGitGadget, Nov 11, 2020
  134. 09/15 strmap: add functions facilitating use as a string->int mapElijah Newren via GitGitGadget, Nov 11, 2020
  135. 08/15 strmap: enable faster clearing and reusing of strmapsElijah Newren via GitGitGadget, Nov 11, 2020
  136. 10/15 strmap: split create_entry() out of strmap_put()Elijah Newren via GitGitGadget, Nov 11, 2020
  137. 11/15 strmap: add a strset sub-typeElijah Newren via GitGitGadget, Nov 11, 2020
  138. 12/15 strmap: enable allocations to come from a mem_poolElijah Newren via GitGitGadget, Nov 11, 2020
  139. 04/15 hashmap: introduce a new hashmap_partial_clear()Elijah Newren via GitGitGadget, Nov 11, 2020
  140. 14/15 Use new HASHMAP_INIT macro to simplify hashmap initializationElijah Newren via GitGitGadget, Nov 11, 2020
  141. 15/15 shortlog: use strset from strmap.hElijah Newren via GitGitGadget, Nov 11, 2020
  142. 13/15 strmap: take advantage of FLEXPTR_ALLOC_STR when relevantElijah Newren via GitGitGadget, Nov 11, 2020
  143. 07/15 strmap: add more utility functionsElijah Newren via GitGitGadget, Nov 11, 2020
  144. Jeff KingNov 11, 2020

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.