ObjcのNSDictionaryとCppのmapはどっちが早いか
2012
12/04
かなり限定された状況下での話ですが、大量のデータを扱うときに、Objective-CのNSDictionaryクラスとC++のstd::mapはどちらが早いのかが気になり調べてみました。
今回必要なのは、キーも値も64bitの整数で、大量に追加してそれを取得するというケースです。必要な機能や状況など、さまざまな背景事情によって何を使用するべきかは変わってきますので、この結果も一つの限定された条件での結果で、一般論ではないということ注意してください。
どちらが早いのか確認するには、作って、試してみるのが手っ取り早いです。そのため、次のようなコードを書きました。
[cc lang=”cpp”]
#import
#import
#define kItemCount 100000
void objc();
void cpp();
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
for (NSInteger i = 0; i < 5; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSDate *date = [NSDate date];
//objc();
cpp();
NSTimeInterval t = [[NSDate date] timeIntervalSinceDate:date];
NSLog(@"%f", t);
[pool release];
}
[pool drain];
return 0;
}
void objc()
{
// Objective-C
NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:kItemCount];
for (uint64_t i = 0; i < kItemCount; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[dict setObject:[NSNumber numberWithUnsignedLongLong:i]
forKey:[NSNumber numberWithUnsignedLongLong:i]];
[pool release];
}
for (uint64_t i = 0; i < kItemCount; i++)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
uint64_t ull = [[dict objectForKey:[NSNumber numberWithUnsignedLongLong:i]] unsignedLongLongValue];
[pool release];
}
}
void cpp()
{
std::map dict;
for (uint64_t i = 0; i < kItemCount; i++)
{
dict[i] = i;
}
for (uint64_t i = 0; i < kItemCount; i++)
{
uint64_t ull = dict[i];
}
}[/cc]
100000件の整数をNSDictionary、もしくは、std::mapに入れて、それを全部取得するというまでの時間を計測して、コンソールに出力するということを5回行うというコードです。
どちらを使用するかは、main関数で、objcとcppという関数のどちらを呼ぶかによって切り替えます。
想像では、整数表現にNSNumberのようなクラスを経由しない、C++版の方が早いだろうと思われます。ただ、どの程度、差が出るのかはやってみないとわからないなというの印象でした。
試してみると、次のような結果でした。
確認環境
Machine : Mac Pro 2 * 2.26 GHz Quad-Core Intel Xeon
メモリ : 16GB 1066 MHz DDR3
OS : Mac OS X 10.6.8
バイナリタイプ : 32bit版
objc()
0.187153
0.190807
0.168759
0.16860
0.169915
cpp()
0.051112
0.051362
0.050292
0.049566
0.047455
std::mapの方が3倍程度早いという結果ですが、100000件でこの位の速度なら、NSDictionaryも想像していたよりも早かったなという印象です。もっと遅くなると思ったので少し意外でした。
この記事を書いた人
アールケー開発代表。Appleプラットフォーム向けの開発を専門としているソフトウェアエンジニア。ソフトウェアの受託開発、技術書執筆、技術指導・セミナー講師。note , Medium , LinkedIn
-
Representative of RK Kaihatsu. Software Engineer Specializing in Development for the Apple Platform. Specializing in contract software development, technical writing, and serving as a tech workshop lecturer. note , Medium , LinkedIn