Я из мира С++/STL, и я хотел проверить, как контейнеры objective-c сравниваются с stl.
Я хотел сравнить массив чисел, но единственный способ добавить число к NSArray
- это использовать NSNumber
, который является крайне медленным и выпил мой баран пустой, поэтому, я думаю, мне нужно удалить их вручную. Но я не хочу тестировать побочные эффекты, поэтому я просто добавил [NSNull null]
в массив.
Результаты добавления 10k вещей в массив 1k раз: NSArray
- 0,923411 секунд vector<int>
- 0.129984 секунды
Я думал, что это могут быть распределения и освобождения, поэтому я устанавливаю количество массивов (imax
в коде) на 1 и количество добавлений до 10000000 (jmax
), но это было еще медленнее
NSArray
- 2.19859 секунд vector<int>
- 0,223471 секунд
Edit:
Как уже упоминалось в комментариях, постоянный увеличивающий размер массива может быть проблемой, поэтому я сделал NSArray
с помощью arrayWithCapacity
, но vector
с reserve
тоже, и он был еще медленнее, чем раньше (!) (imax
= 1, jmax
= 10000000). NSArray
- 2.55942 vector<int>
- 0.19139
Редактирование конца
Почему это так медленно?
Мой код для справки:
#import <Foundation/Foundation.h>
#include <vector>
#include <iostream>
#include <time.h>
using namespace std;
int main (int argc, const char * argv[])
{
int imax = 1000;
int jmax = 10000;
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
cout << "Vector insertions" << endl;
clock_t start = clock();
for(int i = 0; i < imax; i++)
{
vector<int> *v = new vector<int>();
for(int j = 0; j < jmax; j++)
{
v->push_back(j);
}
delete v;
}
double interval = (clock() - start) / (double)CLOCKS_PER_SEC;
cout << interval << " seconds" << endl;
cout << "NSArray insertions" << endl;
start = clock();
for(int i = 0; i < imax; i++)
{
NSMutableArray *v = [[NSMutableArray alloc] init];
for(int j = 0; j < jmax; j++)
{
[v addObject:[NSNull null]];
}
[v dealloc];
}
interval = (clock() - start) / (double)CLOCKS_PER_SEC;
cout << interval << " seconds" << endl;
[pool drain];
return 0;
}