Проблемы с производительностью NSMutableArray и NSArray - PullRequest
1 голос
/ 12 февраля 2010

Я программирую на C / C ++ в течение 20 лет, но я новичок в Objective-C и Coco и у меня есть несколько вопросов по поводу производительности NSMutableArray и NSArray.

Мне нужен контейнер, очень похожий на контейнер списка stl, но у coco, похоже, его нет, и вставка и удаление элементов из середины MSMutableArray кажется медленным, но обрабатывать его как вектор stl тоже не так быстро.

Кроме того, MSMutableArray, похоже, хранит только объекты, поэтому отслеживание простой строки типа данных int или float влечет за собой дополнительные издержки на создание объектов для их хранения.

Я сейчас пишу игру, и производительность очень важна. Я всегда могу заглянуть в C ++, чтобы понять все, что у меня есть в игровом движке, но так много о target-c, что мне нравится, и я бы не хотел отказываться от него.

Существуют ли быстрые stl-подобные контейнеры для target-c, которые я должен использовать?

Есть ли в Интернете хорошая документация о том, как они реализованы, поэтому я могу попытаться понять, почему производительность настолько низкая?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 12 февраля 2010

Классы базовых коллекций, такие как NSMutableArray, не гарантируют использование какой-либо конкретной реализации, и на самом деле я верю, что они фактически изменят свою структуру данных, чтобы оптимизировать скорость для числа содержащихся в них элементов. Вы можете прочитать больше здесь , но в принципе я бы не стал беспокоиться об основном алгоритме.

Вы можете создать свою собственную структуру данных в C (или, если хотите, пойти по маршруту Objective-C ++), что позволит сэкономить память и затраты на производительность, связанные с переносом каждого примитива в NSNumber. Конечно, вы сначала захотите запустить инструменты повышения производительности, чтобы убедиться, что проблема действительно в этом, а вы не просто тратите время.

0 голосов
/ 17 октября 2018

запуск этого простого теста двустороннего доступа на реальном устройстве ipad:

NSMutableArray vs. float *, float типа C * в 109 раз быстрее! , поэтому, если производительность является проблемой, цифры вполне понятны.

-(void)testSpeedNSArrayvsFloat {
const int n=1000000;
NSMutableArray*a=[NSMutableArray arrayWithCapacity:n];

NSTimeInterval tn, tf;
NSDate *t=[NSDate date];
for (int i=0; i<n; i++) {
    a[i]=[NSNumber numberWithFloat:i];
    float _f=[a[i] floatValue];
}
NSLog(@"%d nsarray number: %f",n, tn=-[t timeIntervalSinceNow]);

t=[NSDate date];
float*fa=calloc(n, sizeof(float));
for (int i=0; i<n; i++) {
    fa[i]=i;
    float _f=fa[i];
}

NSLog(@"%d float number: %f",n, tf=-[t timeIntervalSinceNow]);
NSLog(@"Ratio %f",tn/tf);
free(fa);

}

2018-10-17 14: 25: 05.312866 + 0200 voiceXplorer [500: 171209] 1000000 nsarray номер: 1.699707 2018-10-17 14: 25: 05.328571 + 0200 voiceXplorer [500: 171209] 1000000 число с плавающей запятой: 0.015554 2018-10-17 14: 25: 05.328699 + 0200 voiceXplorer [500: 171209] Соотношение 109.278151

0 голосов
/ 12 февраля 2010

Если вы действительно заботитесь о производительности, я рекомендую избегать использования структур данных Foundation через Objective-C, поскольку система времени выполнения исключает все возможности для оптимизации во время компиляции, и, как вы сказали, вам всегда нужно создавать примитивы.

Вы можете просто использовать Objective-C ++ и использовать std::list<id>.

Если вы должны использовать Objective-C, см. CHDataStructures , который содержит тип CHSinglyLinkedList.

...