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

Re: [PATCH v3] skip_prefix: rewrite so that prefix is scanned once

From
David Kastrup <dak@gnu.org>
Date
Mar 4, 2014, 00:09 UTC
Message-ID
<877g8akenw.fsf@fencepost.gnu.org>
In-Reply-To
<CACsJy8ASBeravdk67pbOJbrFUbwg21JwYcLtSbDDMJOu9-F=yA@mail.gmail.com>
Duy Nguyen <pclouds@gmail.com> writes:
Show 14 quoted lines
> On Tue, Mar 4, 2014 at 5:43 AM, Junio C Hamano <gitster@pobox.com> wrote:
>> diff --git a/git-compat-util.h b/git-compat-util.h
>> index cbd86c3..68ffaef 100644
>> --- a/git-compat-util.h
>> +++ b/git-compat-util.h
>> @@ -357,8 +357,14 @@ extern int suffixcmp(const char *str, const char *suffix);
>>
>>  static inline const char *skip_prefix(const char *str, const char *prefix)
>>  {
>> -       size_t len = strlen(prefix);
>> -       return strncmp(str, prefix, len) ? NULL : str + len;
>
> Just a note. gcc does optimize strlen("abcdef") to 6, and with that
> information at compile time built-in strncmp might do better.

Indeed, most (but not all) of the calls have a constant string as prefix. However, strncmp in each iteration checks for both *str as well as *prefix to be different from '\0' independently (and it appears unlikely to me that the optimizer will figure out that it's unnecessary for either) _and_ compares them for equality so it's not likely to be faster than the open-coded loop.

One could, however, use memcmp instead of strncmp. I'm just not sure whether memcmp is guaranteed not to peek beyond the first mismatching byte even if the count would allow for more. It could lead to undefined behavior if the first mismatching byte would be the ending NUL byte of str.

-- 
David Kastrup
Previous: Duy NguyenNext: Duy Nguyen
Message 7 of 9 in “skip_prefix: rewrite so that prefix is scanned once”
  1. skip_prefix: rewrite so that prefix is scanned onceSiddharth Goel, Mar 3, 2014
  2. Junio C HamanoMar 3, 2014
  3. Junio C HamanoMar 3, 2014
  4. David KastrupMar 3, 2014
  5. Junio C HamanoMar 3, 2014
  6. Duy NguyenMar 3, 2014
  7. David KastrupMar 4, 2014
  8. Duy NguyenMar 4, 2014
  9. David KastrupMar 4, 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.