diff --git a/ChangeLog b/ChangeLog index a858bcb84..0ba986f3b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,8 +1,14 @@ +2005-08-31 Richard Frith-Macdonald + + * Source/NSNumber.m: Improve poor hash function. + * Source/NSConcreteNumber.m: Improve poor hash function. + * Testing/benchmark.m: Add some NSNumber tests. + 2005-08-30 Saso Kiselkov * Headers/Foundation/NSSortDescriptor.h, Source/NSSortDescriptor.m: New files - * Headesr/Foundation/Foundation.h, Source/GNUmakefile: Add them to + * Headers/Foundation/Foundation.h, Source/GNUmakefile: Add them to list. 2005-08-25 Richard Frith-Macdonald diff --git a/Source/NSConcreteNumber.m b/Source/NSConcreteNumber.m index 135db5912..1361bec67 100644 --- a/Source/NSConcreteNumber.m +++ b/Source/NSConcreteNumber.m @@ -121,7 +121,7 @@ val.d = [self doubleValue]; for (i = 0; i < sizeof(double); i++) { - hash += val.c[i]; + hash = (hash << 5) + hash + val.c[i]; } return hash; } diff --git a/Source/NSNumber.m b/Source/NSNumber.m index 815b41496..5ed5fb70f 100644 --- a/Source/NSNumber.m +++ b/Source/NSNumber.m @@ -2382,7 +2382,7 @@ static Class doubleNumberClass; val.d = [self doubleValue]; for (i = 0; i < sizeof(double); i++) { - hash += val.c[i]; + hash = (hash << 5) + hash + val.c[i]; } return hash; } diff --git a/Testing/benchmark.m b/Testing/benchmark.m index eb0b7fc2a..5e7e4a189 100755 --- a/Testing/benchmark.m +++ b/Testing/benchmark.m @@ -366,6 +366,62 @@ bench_dict() AUTO_END; } +void +bench_number() +{ + int i; + int j; + NSMutableDictionary *dict; + NSNumber *n[MAX_COUNT*10]; + + AUTO_START; + + printf("NSNumber\n"); + + START_TIMER; + for (i = 0; i < MAX_COUNT*10; i++) + { + n[i] = [NSNumber numberWithInt: i]; + } + END_TIMER; + PRINT_TIMER("NSNumber (creation) \t\t"); + + START_TIMER; + for (i = 0; i < MAX_COUNT; i++) + { + [n[i] hash]; + } + END_TIMER; + PRINT_TIMER("NSNumber (hash) \t\t"); + + dict = [NSMutableDictionary dictionaryWithCapacity: MAX_COUNT]; + START_TIMER; + for (i = 0; i < MAX_COUNT*10; i++) + { + [dict setObject: n[i] forKey: n[i]]; + } + END_TIMER; + PRINT_TIMER("NSNumber (dictionary setObject:) \t\t"); + + START_TIMER; + for (i = 1; i < MAX_COUNT; i++) + { + [n[i] isEqual: n[i-1]]; + } + END_TIMER; + PRINT_TIMER("NSNumber (isEqual:)\t\t"); + + START_TIMER; + for (i = 0; i < MAX_COUNT; i++) + { + [n[i] copyWithZone: NSDefaultMallocZone()]; + } + END_TIMER; + PRINT_TIMER("NSNumber (copy)\t\t"); + + AUTO_END; +} + void bench_str() { @@ -632,6 +688,7 @@ int main(int argc, char *argv[], char **env) pool = [NSAutoreleasePool new]; printf(" Test \t\t\t\t time (sec) \t index\n"); bench_object(); + bench_number(); bench_str(); bench_array(); bench_dict();