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


HSPTV!掲示板


未解決 解決 停止 削除要請

2006
0514
hands条件式5解決


hands

リンク

2006/5/14(Sun) 23:17:00|NO.728

条件式で
aとbとcが0の場合に飛ばすというものなんですが、

if (a=0)&(b=0)&(c=0) : gosub *onstop

if a+b+c<1 : gosub *onstop

上の2つの式ではどちらが高速に処理されるんでしょうか?



この記事に返信する


naznyark

リンク

2006/5/15(Mon) 00:54:27|NO.730

そもそも条件が限定されないならば、式(a)
> if (a=0)&(b=0)&(c=0) : gosub *onstop
と式(b)
> if a+b+c<1 : gosub *onstop
の2つの式は等価ではありません(動作が異なる)。
(例えば a=-100, b=0 , c=0 とか a=0, b=1, c=-1 などの場合)
よってどちらの式が早かろうと式の置き換えをすべきではありません。

(a,b,cがそれぞれ0以上の整数であることが保証されているならば式の置き換えは可能ですが、
a,b,cのどれかが負の値になるような不具合が生じた場合に問題の発見がより困難になるので
やはりこのような置き換えは勧めません。)



Irisawa

リンク

2006/5/15(Mon) 01:11:00|NO.731

完全な保証はありませんが以下のベンチマークで何回かテストした限りではtest2()の方が
早いみたいですね。


#module #uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" #defcfunc test1 wait 1 s_time = timeGetTime() repeat 1000000 if (a = 0) & (b = 0) & (c = 0) : dummy++ loop return timeGetTime() - s_time #defcfunc test2 wait 1 s_time = timeGetTime() repeat 1000000 if a + b + c < 1 : dummy++ loop return timeGetTime() - s_time #global mes "test1() の結果: " + test1() mes "test2() の結果: " + test2() mes "test2() の結果: " + test2() mes "test1() の結果: " + test1() stop

まあ、そんなに違わないですが。
(このベンチマーク自体が間違っていたりして?)



Irisawa

リンク

2006/5/15(Mon) 01:15:07|NO.732

あ、等価かどうかの考慮はしませんでした。
よく考えれば等価ではありませんね。



K

リンク

2006/5/15(Mon) 02:52:11|NO.733

比較を0との比較を1として論理演算を1.5ぐらいで考えると

>if (a=0)&(b=0)&(c=0) : gosub *onstop
比較3回と論理演算2回 6.0

>if a+b+c<1 : gosub *onstop
これは、やるなら (a|b|c)=0 とかでしょう
比較1回論理演算2回 4.0


これは、上と比べて下のが早いだけで、処理全体で考えた場合
この方法が、最速な訳では無い
(aの変数が何割か0にならないとかだと別々に比較のが早い)



hands

リンク

2006/5/15(Mon) 17:14:41|NO.740

naznyarkさん、Irisawaさん、Kさん
ありがとうございます。

変数の内容とか等価かどうかとか、いろんな事が関係してくるんですね。
もっといろいろ試してみようと思います。



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