HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2009
0115
GErif a == 0について10解決


GEr

リンク

2009/1/15(Thu) 22:32:29|NO.22856

ちょっと今試して見てて気になったことがあるので質問させてください。



スクリプトの記述の仕方と処理速度で。
たとえばフラグ変数などを使うとき。


if a == 1{ ごにょごにょ }
とするより

if a{ ごにょごにょ }
の方が早いことがわかったので、いままでこれを使っていたのですが、
ふと


if a==0{ ごにょごにょ }


if a{ } else{ ごにょごにょ }

だとどっちの方が早いかなと思い、上記をそれぞれ1000000回実行したときの速度を計ってみました。
(ごにょごにょには単純に b = 0だけ入れて実行)
そしたら平均して

上が142ms
下が100ms

と一見すると無駄が多い下の方が早くなってしまいました。

なぜ、elseを使うという無駄なルートを通った方が早くなるのでしょうか?
むしろなぜ、単純なa==0がこんなにも遅いのでしょうか?

どなたかお分かりの方がいらっしゃいましたら教えてください。



この記事に返信する


anonymous

リンク

2009/1/15(Thu) 22:59:51|NO.22858

a==0は数値比較だからではないでしょうか。
そもそも、上と下では厳密には違う処理です。

if a==0{
  ごにょごにょ
}

は「aが数値の0」であることをチェックしますが

if a{
}
else{
  ごにょごにょ
}

こちらは、「aがfalse」であることをチェックしています。
つまり、上より処理が単純なんですね。
故に、aの値がOnかOffしかない場合にしか使えません。

アセンブラの勉強をされれば、何故その差が出てくるのかはもっとピンと来るかと思います。
とりあえず、On/Offのフラグであれば、下の方が効率的ですね。



ANTARES

リンク

2009/1/16(Fri) 01:17:32|NO.22866

「if a==0 {」の場合、「a==0」という演算を行ない、その結果が0でないとき、真と見なされます。
cf. a=1: mes a==0: a=0: mes a==0
一方、「if a {」の場合、aが0でないとき、真と見なされます。

>なぜ、elseを使うという無駄なルートを通った方が早くなるのでしょうか?
 上記を踏まえると、「else {……}」の解析より「a==0」の解析と演算の方が
時間がかかるということですね。
解析のみより解析と演算の方が演算の分だけ時間がかかるのはあたり前。
解析と演算のどちらに時間がかかっているかについては、この実験結果からは何も言えません。
100msの内の99msは解析にかかる時間かもしれません。
仮にそうだとすると、解析に99ms、演算に42〜43msということになりますから
「単純なa==0がこんなにも遅い」という仮説には何の根拠もないということになります。



ANTARES

リンク

2009/1/16(Fri) 01:33:40|NO.22868

「単純なa==0がこんなにも遅い」という仮説が正しいとしても、
それをなぜ?と問うのは、「なぜチータはライオンより足が速いのか?」と問うようなもの。
あるいは、「『a==0』の演算はもっと速いはずだ」と考える根拠は?

という答では不満でしょうが、答を実感するには、
自分で解析と演算を行なうスクリプトを書いてみるしかないでしょう。

でも、同じようにa==0の演算が遅くなるとは限りませんし
(逆にもっと遅くなる可能性もあります)、百万回の「a==0」の実行に
42msしかかからないことを遅いとは感じないかもしれません。
まあ、スクリプトを書くのでは、HSPよりずっと遅くなるのはあたり前ですが。

さらに言えば、Windowsにおける42msなんて誤差の範囲です。



GEr

リンク

2009/1/16(Fri) 01:54:48|NO.22869

皆さんご返信ありがとうございます。

>anonymousさん
>こちらは、「aがfalse」であることをチェックしています。

そうだったんですか。
私は以前どっかで
「ifは0か1かで分岐する」
というのを見た気がするのでてっきり数字の0か1かだと思ってました。
0と1って言うのはスイッチのon/offのことだったんですね。
ということは、if a{}というのは変数に「何も入っていない」か「何かがはいっている」
かを調べることだったんですね。

なるほど。
だとすれば速度が違って当然でしたね。
納得です。


>ANTARESさん
>さらに言えば、Windowsにおける42msなんて誤差の範囲です。
たしかにそうですよね。(苦笑
1000000回の内でなおさらたかが40msちょいの差ですものね。
気にしてもしょうがないことでした。



GEr

リンク

2009/1/16(Fri) 01:55:11|NO.22870

チェックし忘れました。



ANTARES

リンク

2009/1/16(Fri) 01:55:40|NO.22871

>解析のみより解析と演算の方が演算の分だけ時間がかかるのはあたり前。
>仮にそうだとすると、解析に99ms、演算に42〜43msということになりますから
「else {……}」の解析にかかる時間と「a==0」の解析にかかる時間が等しいと考えた場合です。
ありそうな仮説ですが、根拠があるとはとても言えません。

 要するに、不思議がるにはあまりに実験がおおざっぱすぎるし、
仮に「a==0が遅い」という仮説が正しいとしても、なぜそれを不思議に感じるかの方が
私には不思議です。
私なら「a==0」が速くても遅くても「ふーん、そうなんだ」と思うだけですが……。



anonymous

リンク

2009/1/16(Fri) 02:56:09|NO.22872

多分、「a==0が遅い」と感じたのではなくて
if a{ と else{ の2ステップを経ているのに下の方が早かった、ことが
不思議だったのではないかと思われます。文面から察するに。

なので、この場合の答えは

if a{ の段階でelse{ の処理も終わっているため、実際は1ステップ。

と答える方が、しっくり来るかもしれません。

ちなみに、それなりの演算数をこなさねばならないリアルタイムゲームであれば
できるだけ早い処理を選択することは大事な考え方です。
ビット演算子も絡めて考えると、更にいいかもしれませんね。



きんぐ

リンク

2009/1/16(Fri) 08:28:56|NO.22873

ちょっとした気づきに疑問を持ち、理由を知ろうとすることは良いことだと思います。
僕も、大変興味深く勉強になりました。

こういう質問が増えれば、この掲示板を通じて、プログラムのおもしろさを知る人
が増えると思います。



GEr

リンク

2009/1/16(Fri) 18:21:48|NO.22894

>ANTARESさん
>要するに、不思議がるにはあまりに実験がおおざっぱすぎるし

ろくな実験もせずに不思議がってしまってすいません;;(汗
私はちょっとでも気になるともう気になって仕方が無い性格なんで、なにも考えずに投稿してしまいました。
なんか私の性格がご迷惑をかけてしまったようで申しわけ無いです。


>anonymousさん
>if a{ と else{ の2ステップを経ているのに下の方が早かった

まさにそこです。
まだHSPもプログラムも触って間もないので、二つの式が一つの式より早かったことがビックリでした。
>if a{ の段階でelse{ の処理も終わっているため、実際は1ステップ。
が非常にしっくりきました。


>きんぐさん
そういっていただけると気が楽になります。
ありがとうございます。

ありがとうございます。



ANTARES

リンク

2009/1/17(Sat) 07:54:56|NO.22904

>なんか私の性格がご迷惑をかけてしまったようで申しわけ無いです。
GErさんが不思議だと感じたことが不思議だっただけで、迷惑なんてとんでもないです。



ONION software Copyright 1997-2023(c) All rights reserved.