我来自C++/STL的世界,想要比较一下Objective-C容器和STL的差异。
我想比较一个数字数组,但是添加一个数字到NSArray
中的唯一方法是使用NSNumber
,这非常慢且会耗尽我的内存,所以我猜我需要手动释放它们。但我不想测试副作用,所以我只是往数组里添加了一个[NSNull null]
。
将10k个元素添加到数组中1k次的结果如下:
NSArray
- 0.923411秒
vector<int>
- 0.129984秒
我认为可能是分配和释放内存的原因,所以我将数组数(代码中的imax
)设置为1,将添加次数(jmax
)设置为10000000,但速度甚至更慢了。
NSArray
- 2.19859秒
vector<int>
- 0.223471秒
编辑:
如评论中所提到的,数组大小的不断增加可能是问题所在,因此我使用了arrayWithCapacity
创建了NSArray
,但也使用了reserve
创建了vector
,结果比之前还要慢(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;
}