東方必技禄(3)

何となく、ソース全面書き換えをしているんだけども、やっぱりぐっちゃぐっちゃになってきた。
う〜〜ん。やっぱりきれいにならないねぇ。


一応、高速化のために、Objective-Cのクラスの使用は最小限にしているんだけども、あんまりかわらない気がするのは気のせいだろうか。
Objective-Cのクラスにすると、メソッド呼び出しでオーバーヘッドが生じるため、頻繁に呼び出しを行うような場合はパフォーマンスが悪くなる。なので、なるべくC言語オンリーで書くのが良いのだけども、あらかじめ大量にメモリを確保しておくのもどうかと思う。PCと違ってメモリ多くないからね。
あ、malloc は逐次的にメモリ確保する場合はあまり向いていないと思うんで。でもCではそれしかないんだよね。
この辺りの兼ね合いがなかなか難しい。


一応 Objective-Cのメソッド呼び出し時におこるオーバーヘッドを軽くする手だてはあるので、それを多用すると結構ぐちゃぐちゃになるので困ったもんだ。この必技禄でも多用しているメソッド呼び出しのオーバーヘッドをなくす?方法を記しておこう。あ〜、Objective-Cのメソッド呼び出しの仕組みは別途どっかで調べてね。いちいち書いてらんねぇ。面倒だ。


まぁ、簡単に書いておくと、Objcetive-Cのクラスでは、メソッドリストを各クラスがもっていて、メソッドが呼び出されるとき、このリストから対象のメソッドを探し、それを呼び出す仕組みになっている。たしか。きっと。だったと思う。
Objective-CC言語の拡張で、メソッドは一種の関数であることから考えると、このメソッドのポインタさえわかれば直接呼び出せる。そのため、メソッドを探すという過程をすっ飛ばすのでオーバーヘッドが軽くできるという訳だ。Objective-CではIMP型で扱われる。

IMP impFunction = [obj methodForSelector:@selector(method)];

で関数ポインタを取得しておいて

impFunction(obj, @selector(method));

で呼び出せばよい。引数があるときは

IMP impFunction = [obj methodForSelector:@selector(addObject:)];
impFunction(obj, @selector(addObject:), obj1);

とすればいける。
これで少し高速化が見込める。
これをうまく使えば、Objective-Cで読みやすいソースである程度高速処理ができるかもね。