some optionisation of string equality test ... don't compute hash of string

unless the string is large enough to make it worthwhile.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38541 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2015-05-25 14:51:02 +00:00
parent 493a170d6a
commit 83dda5160c

View file

@ -2992,11 +2992,11 @@ isEqual_c(GSStr self, id anObject)
{
return NO;
}
if (GSObjCIsInstance(anObject) == NO)
c = object_getClass(anObject);
if (class_isMetaClass(c) == YES)
{
return NO;
}
c = object_getClass(anObject);
if (c == NSConstantStringClass)
{
return literalIsEqualInternal((NXConstantString*)anObject, (GSStr)self);
@ -3006,15 +3006,24 @@ isEqual_c(GSStr self, id anObject)
GSStr other = (GSStr)anObject;
NSRange r = {0, self->_count};
/*
* First see if the hash is the same - if not, we can't be equal.
/* First see if the hash is the same - if not, we can't be equal.
* However, it's not worth calculating hashes unless the strings
* are fairly long.
*/
if (self->_flags.hash == 0)
self->_flags.hash = (*hashImp)((id)self, hashSel);
if (other->_flags.hash == 0)
other->_flags.hash = (*hashImp)((id)other, hashSel);
if (self->_flags.hash != other->_flags.hash)
return NO;
if (self->_count > 15)
{
if (self->_flags.hash == 0)
self->_flags.hash = (*hashImp)((id)self, hashSel);
if (other->_flags.hash == 0)
other->_flags.hash = (*hashImp)((id)other, hashSel);
if (self->_flags.hash != other->_flags.hash)
return NO;
}
else if (self->_flags.hash && other->_flags.hash)
{
if (self->_flags.hash != other->_flags.hash)
return NO;
}
/*
* Do a compare depending on the type of the other string.
@ -3055,11 +3064,11 @@ isEqual_u(GSStr self, id anObject)
{
return NO;
}
if (GSObjCIsInstance(anObject) == NO)
c = object_getClass(anObject);
if (class_isMetaClass(c) == YES)
{
return NO;
}
c = object_getClass(anObject);
if (c == NSConstantStringClass)
{
return literalIsEqualInternal((NXConstantString*)anObject, (GSStr)self);
@ -3069,15 +3078,24 @@ isEqual_u(GSStr self, id anObject)
GSStr other = (GSStr)anObject;
NSRange r = {0, self->_count};
/*
* First see if the hash is the same - if not, we can't be equal.
/* First see if the hash is the same - if not, we can't be equal.
* However, it's not worth calculating hashes unless the strings
* are fairly long.
*/
if (self->_flags.hash == 0)
self->_flags.hash = (*hashImp)((id)self, hashSel);
if (other->_flags.hash == 0)
other->_flags.hash = (*hashImp)((id)other, hashSel);
if (self->_flags.hash != other->_flags.hash)
return NO;
if (self->_count > 15)
{
if (self->_flags.hash == 0)
self->_flags.hash = (*hashImp)((id)self, hashSel);
if (other->_flags.hash == 0)
other->_flags.hash = (*hashImp)((id)other, hashSel);
if (self->_flags.hash != other->_flags.hash)
return NO;
}
else if (self->_flags.hash && other->_flags.hash)
{
if (self->_flags.hash != other->_flags.hash)
return NO;
}
/*
* Do a compare depending on the type of the other string.