0xFFFFFFm走 -構文杯-

 のそのまんま続きです。



 某所にて教えてもらったので、

最近はそこそこローカル変数を使っているわけですが、

…はて?本当にコスト無しなのかな??

と思ったので調べてみたり。

後、ブロックの方もアセンブラでみると

二行ほど*1書き込まれるようなので、

コチラもコストがかかるか否か検証してみたり。




/*
* 基本的に上記と一緒
* 内部の計算は「除算」のものを使用し、
* ローカルの方はfor文の頭で宣言のみ
* ブロックの方は計算する文を括ったのみ
* (丁度一段インデントを上げるだけの様な形)です。
*/

/ : 381733.8
local: 395281.2
block: 394256

……微妙(苦笑)

約1700万回で13〜14ms位の差…?(汗)

ということは、1回あたりだと0.00001ms(=0.01μs=10ns(笑))位??(汗)

…コストは皆無というわけでは無いけど…

それがどうした

という感じかなぁ…(苦笑)





 最後に、おまけ(?)で

if文と(浮動小数関連の)キャスト*2の結果も。




/* if文
* 成功でも失敗でも変数に値を代入するだけです。
* →失敗時はelseに飛ぶようにしてあります。
*/
// true

if : 94762.2
// false -> elseへ
ifn: 59923.8


/* 浮動小数のキャスト
* 共にキャストして代入するだけです。
*/
// int -> double

id : 39393.6
// double -> int
di : 689481.6

…アレ?elseに飛んだ方が速いんですね。

これまた意外な。

…何だろ、余分なjump構文でも入ってるのかな?

……でも、どっちでもjump回数は変わらないと思うんだけどなぁ…。



 キャストの方は噂通り

…って、整数に直すの重すぎだよ!(驚・汗)

あの「ftol2()」だか「ftoi2()」*3だかがそんなに重いのか?(汗)

…というより、小数に直すのは結構速いくせに

整数にするのは何でそんなにかかるんだ?

……まさか、pow()辺りで地道に変換とか…はしてないよね…流石に(苦笑)




*1:何かスタックに積んでるだけのようだけど…。
変数のスコープ関連かな?単純に。

*2:「int -> double」は軽いけど、
「double -> int」は重いというのを聞いた事があるのでその検証。

*3:アセンブラを覗いたら出てきた。
どうもコイツでキャストしているらしい。