@ JeremyP предоставляет отличную ссылку и информацию. Всегда читай рыбу. Вот некоторая разбивка того, что ест время, и что вы можете с этим поделать.
Во-первых, существует множество вызовов objc_msgSend()
для динамической отправки. Этого можно избежать, и вы сэкономите некоторое время (хотя и не так много, как вы думаете. objc_msgSend()
- это сумасшедшая оптимизация ). Но вы можете получить скидку 5%, пропустив это:
IMP addObject = class_getMethodImplementation([NSMutableArray class], @selector(addObject:));
NSNull *null = [NSNull null];
start = clock();
for(int i = 0; i < imax; i++)
{
NSMutableArray *v = [[NSMutableArray alloc] init];
for(int j = 0; j < jmax; j++)
{
addObject(v, @selector(addObject:), null);
}
[v release];
}
Много времени съедено с retain
/ release
. Вы можете избежать этого (и вставлять действительные числа вместо NSNumber
), используя не сохраняющий CFMutableArray
). Это позволит увеличить время добавления примерно до 2х vector
.
CFArrayCallBacks cb = {0};
for(int i = 0; i < imax; i++)
{
CFMutableArrayRef v = CFArrayCreateMutable(NULL, 0, &cb);
for(int j = 0; j < jmax; j++)
{
CFArrayAppendValue(v, &j);
}
CFRelease(v);
}
Самая большая стоимость этого звонка - звонки на memmove()
(или его коллекционную версию на Mac).
Человек, NSMutableArray
конечно медленно. Как Apple может быть такой глупой, верно? Я имею в виду, действительно ... подожди ... Интересно, есть ли что-то NSMutableArray
лучше, чем vector
?
Попробуйте поменять эти строки на их очевидные аналоги:
v->insert(v->begin(), j);
NSNumber *num = [[NSNumber alloc] initWithInt:j];
[v insertObject:num atIndex:0];
[num release];
(Да, включая создание и выпуск NSNumber
, а не только использование NSNull
.)
О, и вы тоже можете попробовать это, чтобы увидеть, насколько быстрыми NSMutableArray
и CFMutableArray
действительно могут быть:
CFArrayInsertValueAtIndex(v, 0, &j);
В моих тестах я получаю:
Vector insertions
7.83188 seconds
NSArray insertions
2.66572 seconds
Non-retaining
0.310126 seconds