ObjcのNSDictionaryとCppのmapはどっちが早いか

かなり限定された状況下での話ですが、大量のデータを扱うときに、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も想像していたよりも早かったなという印象です。もっと遅くなると思ったので少し意外でした。

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

関連記事

  1. iMessageのステッカーサンプル作成

  2. ParallelsのUSB制御がとても良くなっている

  3. iPhone用のお問い合わせページを作成しました

  4. GW中もいつもと同じ

  5. 新刊の原稿書き上がりました

  6. ownCloudを入れてみた

最近の著書

  1. 基礎から学ぶ SwiftUI

人気記事

最近の記事