Another tiny string optimisation

git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@38525 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
Richard Frith-MacDonald 2015-05-22 16:24:27 +00:00
parent 6297efeec9
commit 19ba70e988
2 changed files with 58 additions and 3 deletions

View file

@ -749,6 +749,38 @@ static BOOL useTinyStrings;
#define TINY_STRING_CHAR(s, x) ((s & (0xFE00000000000000 >> (x*7))) >> (57-(x*7)))
#define TINY_STRING_LENGTH_MASK 0x1f
#define TINY_STRING_LENGTH_SHIFT OBJC_SMALL_OBJECT_SHIFT
static BOOL
tinyEqualToString(uintptr_t s, NSString *aString)
{
NSUInteger l;
if ((NSString*)s == aString)
{
return YES;
}
l = (s >> TINY_STRING_LENGTH_SHIFT) & TINY_STRING_LENGTH_MASK;
if ([aString length] != l)
{
return NO;
}
else if (l > 0)
{
unichar buf[8];
[aString getCharacters: buf range: NSMakeRange(0, l)];
while (l-- > 0)
{
if ((unichar)TINY_STRING_CHAR(s, l) != buf[l])
{
return NO;
}
}
}
return YES;
}
@interface GSTinyString : NSString
@end
@ -950,6 +982,11 @@ tsbytes(uintptr_t s, char *buf)
#endif
}
- (BOOL) isEqualToString: (NSString*)aString
{
return tinyEqualToString((uintptr_t)self, aString);
}
- (NSUInteger) length
{
uintptr_t s = (uintptr_t)self;
@ -5571,6 +5608,17 @@ literalIsEqual(NXConstantString *self, id anObject)
{
return NO;
}
#if defined(OBJC_SMALL_OBJECT_SHIFT) && (OBJC_SMALL_OBJECT_SHIFT == 3)
if (useTinyStrings)
{
uintptr_t s = (uintptr_t)anObject;
if (s & TINY_STRING_MASK)
{
return tinyEqualToString((uintptr_t)anObject, self);
}
}
#endif
if (GSObjCIsInstance(anObject) == NO)
{
return NO;

View file

@ -2685,12 +2685,19 @@ static BOOL (*nbImp)(id, SEL, unichar) = 0;
*/
- (BOOL) isEqualToString: (NSString*)aString
{
if (aString == self)
{
return YES;
}
if ([self hash] != [aString hash])
return NO;
{
return NO;
}
if (strCompNsNs(self, aString, 0, (NSRange){0, [self length]})
== NSOrderedSame)
return YES;
{
return YES;
}
return NO;
}