i368/x86_64で-[NSObject hash]が激遅に!?
-[NSObject hash]の話題をTLで拾ったので広げてみた。
Mac OS Xにはx84_64とi386の二つのアーキテクチャがあります。
この二つの-[NSObject hash]が何を返すのかをgdbで調べてみました。*1
x86_64
push %rbp mov %rsp,%rbp mov %rdi,%rax ; 第一引数を戻り値に leaveq retq
push %ebp mov %esp,%ebp mov 0x8(%ebp),%eax ; 第一引数を戻り値に leave ret
Objective-Cで書くと両方ともこうなります。
- (NSUInteger)hash { return (NSUInteger)self; }
わりと分かりやすい。w
Objective-Cのメソッドでは第一引数は隠し引数であるselfです。
で、少し前まではPPCアーキテクチャがありました。もちろん今でもまだありますが。
それも調べてみました。
ppc
blr ; 何もせず帰る
すごく、単純です。
これをObjective-Cで書くとこうなります。
- (NSUInteger)hash { return (NSUInteger)self; }
これにはMac OS X/PCCの変態的(?)な値の受け渡しに答えがあります。
PPCでは第一引数をr3レジスタに入れて関数に渡します。
で、関数は返り値をr3レジスタに入れて返します。*2
つまり、何もしないと、第一引数を返り値として返す事になるんですね。
てことで、PPCからi386/x86_64に変わった事で-[NSObject hash]は余分にクロックを消費する事になってしまったようです。
だからなに?って言われると困るけどw