投稿
bigslope bigslope
GOSUBって、DEFの使い方を知った後では何の役にも立たないってイメージがあるけど、GOSUBは同じルーチンの変数をそのまま参照出来るのに対し、DEFの方は、必要な変数を全部渡さなければならないので、引数の数が多くなってくると、結構大変になってくる。時には使い分けも必要かもね。
7そうだね
プレイ済み
返信[1]
親投稿
DEFでもグローバルな変数は参照できるし、危険度的にはGOSUBは危ないという理解だけはしておいた方がいいですよ。 BASICの場合は理解した上であえてGOSUBやGOTOを使うのであれば、それはアリかなとは思っていますです、はい。
0そうだね
プレイ済み
返信[2]
親投稿
けい kei0baisoku
今のところ把握してるGOSUBのメリット……… ・中でGOTOやGOSUBが使える ・中からRESTORE命令を使って外のアドレスをセットできる うむむ、こんなもんでしたっけ?(-ω-) あと、初めての人にとっては文法がGOTOに近いから入りやすい、っていうのが大きいですね。
0そうだね
プレイ済み
返信[3]
親投稿
けい kei0baisoku
あ、一点補足。 二つ目の「RESTORE使える」は、関数内で使えないのがむしろ不具合だそうです。(公式障害情報より)
1そうだね
プレイ済み
返信[4]
親投稿
おかっぺ Japanese_WASABI
GOSUB は、DEFよりも速い、も追加で。 ※この速度差はとてつもなく小さな時間の差なので、意識する必要がある人は神々だけだとは、思いますが・・ 確認してないけど、GOSUBが速いよね?
1そうだね
プレイ済み
返信[5]
親投稿
あとGOSUBの方がDEFより早いみたいですね
1そうだね
プレイ済み
返信[6]
親投稿
被っちゃいました 単純に値を1づつ1000万回足して比べてみましたが2.7倍くらい早いみたいです
1そうだね
プレイ済み
返信[7]
親投稿
欲張りすぎかもしれませんが、C言語の構造体のようなものがあると、便利ですよね。 数値の配列と文字列の配列に同じ名前をつけて、代替えしたこともありますがが、インデクスの指定間違えをすると、間違いを探し出すのが、とっても大変でした。
0そうだね
プレイ済み
返信[8]
親投稿
自分も100万ループで試したらDEFのほうが遅いですね(GOSUB5.5秒 DEF15秒) これほどの差があるとは思わなかった
1そうだね
プレイ済み
返信[9]
親投稿
さぼてん saboten-seventh
出来るなら毎フレーム呼び出されるなら速度的にDEFよりGOSUBが良いような気がします(特に旧3DS)
1そうだね
プレイ済み
返信[10]
親投稿
bigslope bigslope
グローバル変数とローカル変数がごっちゃになってしまう危険性は、今時の言語に慣れている人の視点だと思いますが、GOSUB全盛期のかつてのBASICは、そもそもローカル変数なんて概念は無く、全てがグローバル変数という考え方だったので、変数がかち合わないように気を付けるのは普通の事でした(確かに今からプログラミングを始める人にはトラブルの種かも知れませんが)。 あと、この場合は、メインルーチンの中で同じような処理を行っている所が複数あり、また、いずれ消す予定の一時的なものなので、わざわざDEFを興すまでもない、テスト的な用途に使えるかなという感じで使っています。 DEFは基本的にすべて引数渡し、グローバル変数は、C言語の#defineみたいに先頭で定義したもののみ参照という個人的ポリシーで運用しています。
1そうだね
プレイ済み
返信[11]
親投稿
おかっぺ Japanese_WASABI
100万倍にしたスケールで考えるから、大きな差に見えますが、1回の呼び出しで、0.0000055秒と 0.0000015秒の差だから、SPHITみたいなループ中で呼ばれるピンポイントだけ、GOSUBにしたい。しかし、そうすると結局、DEFをほぐしてまわることになるジレンマ。 DEFの中で、DEF内にあるラベルのみGOSUB出来る仕様でも良いのよ♪(チラッ
1そうだね
プレイ済み
返信[12]
親投稿
まあBASICなんだし細かいことにこだわり過ぎずに楽しくやるのが一番だと思います。
3そうだね
プレイ済み
返信[13]
親投稿
けい kei0baisoku
ああなるほど、速度は差がありますね。 関数の方が裏でナンダカンダやってくれてるので納得の結果。 (自分でも計ってみたい………(´ω`))
0そうだね
プレイ済み
返信[14]
親投稿
おかっぺ Japanese_WASABI
ここを見てしまった、~中級者の方へ。DEFはGOSUBより遅いと書いてありますが、多分、それを意識する必要は今はありません。基本的にDEFの方がバグを少なく出来る便利なモノです。仮にゲームが遅延する状況になっても、他の対応で速くする方が圧倒的に楽になりますので、基本はDEF。もし、本気でプチコン3号さんの本気を見たくなったらGOSUBと言う話なのですから、誤解しないでくださいね。
3そうだね
プレイ済み
返信[15]
親投稿
けい kei0baisoku
今さらで申し訳ないですが、速度を丁寧に計ってみました。 足し算とかループのための処理すら除いた、純粋に呼んで戻るだけにかかる時間です。 (3DSLLです) 60fpsの1フレームの時間を100%とすると……… (いずれも有効桁数3ケタ) GOSUB → 0.0078% DEF命令 → 0.0656% X=X+1 → 0.0077% GOSUBとDEF命令の差 = 0.0578% つまり、1フレームの間に200回くらい呼んでるならGOSUBとDEF命令で10%くらい差が出ますが、そこまでヘビーな事をやってるならおかっぺさんのおっしゃるとおり、そもそもアルゴリズムとかを見直す方が遥かに効果があると思います。 使いやすさから言っても初心者の人には私もDEFの方を勧めたいですね。
1そうだね
プレイ済み
返信[16]
親投稿
けい kei0baisoku
でもある程度慣れたら、何となく便利な方ではなく、何が違うのかとか何が危ないかをきちんと理解するのも大事だと思います。 大分話が逸れましたが、元々の「使い分けも必要かもね」という考え方も賛成です。
0そうだね
プレイ済み
返信[17]
親投稿
ヒロブミ hirobumi-mmo
BASIC以外の言語に移行する時の事を考えるとやはりDEFの方を勧めたいですね。 変数名記述ミスによるエラーの防止に関してはOPTION STRICT命令がお勧めです。 BASICの手軽さが多少犠牲になるのが難点ですが。
1そうだね
プレイ済み
返信[18]
親投稿
otta777 otta777a
DEF命令の方が処理に時間が掛かるのは引数やOUT 変数などの チェックをするためだと思います。 GOSUBではそのチェックはありませんからね。
0そうだね
プレイ済み
返信[19]
親投稿
けい kei0baisoku
あ、すみません。誤解を招くと行けないので一応補足を。 多分他の人のもそうだと思いますが、私の計測は引数も返り値も使わず、GOSUBとDEFで全く条件が同じになるようにしています。 だから、それらを使ったら差はもっとあると思います。 でも、引数や返り値は関数の方にしか無い機能なので、その場合はそもそも使い分けに悩む必要すらないですね。
0そうだね
プレイ済み
返信[20]
親投稿
処理速度だけを考えたらアセンブラ以外の言語が出てくるわけがないし、あまり速度にこだわりすぎても本末転倒になりかねないですので気にしすぎることはないと思います。むしろ速度面では呼び出しコストよりもアルゴリズムを工夫するべきだし…。 ただ難しい事を考えて全てがつまらなくなるよりは楽しく学び、必要に応じて利用していけばいいと思っています。なので僕は方法論は言いますが強制はしたくないですし、本来プログラムは楽しくなければいけないとも思いますしね〜。 ただみなさんの言ってる事は間違っているわけではないので、気に入ったことや納得できる内容で自分もやってみたいと思ったら臆せずに積極的にトライしてみてください。
2そうだね
プレイ済み