mirror of
https://git.proxmox.com/git/libgit2
synced 2025-08-12 12:00:29 +00:00
git_oid_cmp: inline memcmp by hand to optimize
git.git uses an inlined hashcmp function instead of memcmp, since it performes much better when comparing hashes (most hashes compared diverge within the first byte). Measurements and rationale for the curious reader: http://thread.gmane.org/gmane.comp.version-control.git/172286
This commit is contained in:
parent
6810ba089a
commit
f6b26e770f
@ -136,7 +136,31 @@ GIT_EXTERN(void) git_oid_cpy(git_oid *out, const git_oid *src);
|
||||
* @param b second oid structure.
|
||||
* @return <0, 0, >0 if a < b, a == b, a > b.
|
||||
*/
|
||||
GIT_EXTERN(int) git_oid_cmp(const git_oid *a, const git_oid *b);
|
||||
GIT_INLINE(int) git_oid_cmp(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
const unsigned char *sha1 = a->id;
|
||||
const unsigned char *sha2 = b->id;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GIT_OID_RAWSZ; i++, sha1++, sha2++) {
|
||||
if (*sha1 != *sha2)
|
||||
return *sha1 - *sha2;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare two oid structures for equality
|
||||
*
|
||||
* @param a first oid structure.
|
||||
* @param b second oid structure.
|
||||
* @return true if equal, false otherwise
|
||||
*/
|
||||
GIT_INLINE(int) git_oid_equal(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
return !git_oid_cmp(a, b);
|
||||
}
|
||||
|
||||
/**
|
||||
* Compare the first 'len' hexadecimal characters (packets of 4 bits)
|
||||
|
@ -161,11 +161,6 @@ void git_oid_cpy(git_oid *out, const git_oid *src)
|
||||
memcpy(out->id, src->id, sizeof(out->id));
|
||||
}
|
||||
|
||||
int git_oid_cmp(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
return memcmp(a->id, b->id, sizeof(a->id));
|
||||
}
|
||||
|
||||
int git_oid_ncmp(const git_oid *oid_a, const git_oid *oid_b, unsigned int len)
|
||||
{
|
||||
const unsigned char *a = oid_a->id;
|
||||
|
@ -28,13 +28,8 @@ GIT_INLINE(khint_t) hash_git_oid(const git_oid *oid)
|
||||
return h;
|
||||
}
|
||||
|
||||
GIT_INLINE(int) hash_git_oid_equal(const git_oid *a, const git_oid *b)
|
||||
{
|
||||
return (memcmp(a->id, b->id, sizeof(a->id)) == 0);
|
||||
}
|
||||
|
||||
#define GIT__USE_OIDMAP \
|
||||
__KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, hash_git_oid, hash_git_oid_equal)
|
||||
__KHASH_IMPL(oid, static kh_inline, const git_oid *, void *, 1, hash_git_oid, git_oid_equal)
|
||||
|
||||
#define git_oidmap_alloc() kh_init(oid)
|
||||
#define git_oidmap_free(h) kh_destroy(oid,h), h = NULL
|
||||
|
Loading…
Reference in New Issue
Block a user