Vengo de un mundo C++/STL y quería comprobar cómo son los contenedores object-c en comparación con stl.¿Cómo puede NSArray ser tan lento?
Quería comparar una matriz de números, pero la única forma de agregar un número a NSArray
es utilizando NSNumber
, que es completamente lento y bebí mi memoria RAM vacía, así que supongo que debo desasignarlos manualmente. Pero no quiero probar los efectos secundarios, así que agregué [NSNull null]
en la matriz.
Los resultados de la adición de 10k cosas en una matriz 1k veces:
NSArray
- 0.923411 segundos
vector<int>
- 0,129984 segundos
pensé que podría ser asignaciones y cancelaciones de asignación de modo fijo el número de matrices (imax
en el código) a 1 y el número de adiciones a 10000000 (jmax
) pero era aún más lento
NSArray
- 2.19859 segundos
vector<int>
- 0.223471 segundos
Editar:
Como se mencionó en los comentarios al creciente tamaño constante de la matriz podría ser el problema por lo que hizo NSArray
usando arrayWithCapacity
, pero vector
con reserve
demasiado y fue incluso más lento que antes (imax
= 1, (!) jmax
= 10000000).
NSArray
- 2,55942
vector<int>
- 0,19139
Fin de edición
Por qué es tan lento?
Mi código de referencia:
#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;
}
Si desea velocidad para almacenar datos, ¿por qué no utilizar una matriz C? – sidyll
Almacenar cualquier cosa, incluso nulos, toma 10 veces más lento – Dani