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

Re: [PATCH v2 0/3] add strnncmp() function

From
Ondřej Bílka <neleai@seznam.cz>
Date
Jun 18, 2014, 10:33 UTC
Message-ID
<20140618103331.GA12445@domone.podge>
In-Reply-To
<53A02195.8080202@web.de>
On Tue, Jun 17, 2014 at 01:08:05PM +0200, Torsten Bögershausen wrote:
Show 33 quoted lines
> On 2014-06-17 09.34, Jeremiah Mahler wrote:
> > Add a strnncmp() function which behaves like strncmp() except it takes
> > the length of both strings instead of just one.
> > 
> > Then simplify tree-walk.c and unpack-trees.c using this new function.
> > Replace all occurrences of name_compare() with strnncmp().  Remove
> > name_compare(), which they both had identical copies of.
> > 
> > Version 2 includes suggestions from Jonathan Neider [1]:
> > 
> >   - Fix the logic which caused the new strnncmp() to behave differently
> > 	from the old version.  Now it is identical to strncmp().
> > 
> >   - Improve description of strnncmp().
> > 
> > Also, strnncmp() was switched from using memcmp() to strncmp()
> > internally to make it clear that this is meant for strings, not
> > general buffers.
> I don't think this is a good change, for 2 reasons:
> - It changes the semantics of existing code, which should be carefully
>   reviewed, documented and may be put into a seperate commit.
> - Looking into the code for memcmp() and strncmp() in libc,
>   I can see that memcmp() is written in 13 lines of assembler,
>   (on a 386 system) with a fast
>     repz cmpsb %es:(%edi),%ds:(%esi)
>   working as the core engine.
>   
>   strncmp() uses 83 lines of assembler, because after each comparison
>   the code needs to check of the '\0' in both strings.
> - I can't see a reason to replace efficient code with less efficient code,
>   so moving the old function "as is" into a include file, and declare
>   it "static inline" could be the first step.
> 

That is not true, a rep cmpsb was fast for 486 but is relatively slow for newer processors. For performance a correct answer is to measure it than do blind guess. Are these strings null terminated or is giving a size just a hint? If it is a hint then a plain strcmp could be faster (this depends on implementation). A reason is that for implementations that check more bytes at once it is easier to combine a terminating null mask with difference than trying to first find which of first 16 bytes are different and then compare if it is within size.

Previous: Jeremiah Mahler
Message 15 of 15 in “add strnncmp() function”
  1. 0/3 add strnncmp() functionJeremiah Mahler, Jun 17, 2014
  2. 1/3 add strnncmp() functionJeremiah Mahler, Jun 17, 2014
  3. Torsten BögershausenJun 17, 2014
  4. Jeremiah MahlerJun 17, 2014
  5. Erik Faye-LundJun 17, 2014
  6. Jeremiah MahlerJun 17, 2014
  7. Junio C HamanoJun 17, 2014
  8. Jeremiah MahlerJun 17, 2014
  9. 2/3 tree-walk: simplify via strnncmp()Jeremiah Mahler, Jun 17, 2014
  10. 3/3 unpack-trees: simplify via strnncmp()Jeremiah Mahler, Jun 17, 2014
  11. Torsten BögershausenJun 17, 2014
  12. Jeremiah MahlerJun 17, 2014
  13. Jonathan NiederJun 17, 2014
  14. Jeremiah MahlerJun 17, 2014
  15. Ondřej BílkaJun 18, 2014

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.