プレイ日記
スー thanks_0u0
遅い遅いとウワサの配列くん。 二次元と一次元とどっちが良いのかなー、と思ってちょっと調べー( ' u ' ) 下手なやり方をするよりは二次元の方が早いみたい?
19そうだね
プレイ済み
返信[1]
親投稿
スー thanks_0u0
ちょっとしたことに気を遣わないと、二次元とそんなに変わらない速度に。
0そうだね
プレイ済み
返信[2]
親投稿
スー thanks_0u0
こっちが正解です。かけ算も結構遅いのかなー。
0そうだね
プレイ済み
返信[3]
親投稿
スー thanks_0u0
三次元でも同じような結果でした。速度を求めるならやっぱり一次元みたいです。 ただしやり方を間違えると逆効果になるぽいので、かけ算を極力減らしながら一次元を使うように気をつけるー。 そういえば作りかけのアクションゲーム、二次元配列使ってた気がするかもー(・д・)
0そうだね
プレイ済み
返信[4]
親投稿
SilverBlue Corei72630QM
INC、DECは、配列に限れば、X[0]=X[0]+N[0]よりも早いようです。
4そうだね
プレイ済み
返信[5]
親投稿
スー thanks_0u0
配列の参照が遅いので、足し算中に何度も配列が出てくると毎回参照しに行くから時間がかかるみたいですね(・u・) 大分前におちゃめさんかどなたかが言ってらして、「へー!」って思ったので配列の場合はINC,DECを使うようにしています。 逆に普通の変数だと足し算の方が早いらしいですね。そっちはあまり高速化の効果は無さそうですけど。
1そうだね
プレイ済み
返信[6]
親投稿
MIKI ifconfig
これが激遅四天王だ!! ・関数より遅い配列! ・除算より遅い乗算! ・加算より遅い inc! ・repeat until より遅い goto! 実行ステップは、変数名で+2,定数で+1,関数+1くらいと想像しています。 1. a[i*8+j]:2+2+1+1+1+2=9 2. a[k+j]:2+2+1+2=7 3. b[j,i]:2+2+2=6 ベンチマークで 3 が 2 より遅いのは多次元配列が遅いのかなと思いますね。
8そうだね
プレイ済み
返信[7]
親投稿
MIKI ifconfig
> 変数名で+2,定数で+1,関数+1くらいと想像しています。 演算子忘れてた! 演算子も +1 くらいです。きっと。 a[i*8+j] が 9 ステップてのは a:2 i:2 *:1 8:1 +:1 j:2 という計算です。
2そうだね
プレイ済み
返信[8]
親投稿
スー thanks_0u0
なるほど!Σ(・□・;) そんな仕組みなんですね。実行ステップ、後で調べてみますー(・u・) ていうかGOTO遅いんですか!REPEAT〜UNTILの方が早いのは初耳でした。ありがとうございます( ´ ▽ ` )ノ これからメインループはREPEATにしようかなぁ。。
1そうだね
プレイ済み
返信[9]
親投稿
乗算遅いのΣ(・□・;)
3そうだね
プレイ済み
返信[10]
親投稿
ish owlis1
皆さんのような知見がなく恥ずかしいのですが。 先日ハマった配列周りの「私にとっては不思議」な挙動。 1回目と2回目のスピード差が5倍以上あってびっくらしましたとさ。
4そうだね
プレイ済み
返信[11]
親投稿
スー thanks_0u0
1回目と2回目って全く同じことをしているのでしょうか??それで5倍って確かに不思議ですね(・д・) 初回の代入でメモリ領域が確定して、2回目からはそれをどうこうしてるとか、なんかそういうのがあるのでしょうか。。。うーん。
1そうだね
プレイ済み
返信[12]
親投稿
ish owlis1
ちなみに2回目のが遅いという。
2そうだね
プレイ済み
返信[13]
親投稿
MIKI ifconfig
ishさん、これは知りませんでした。 一度目はメモリを確保するだけ。 二度めはそれプラス現在の値を解放しなければならないので、その解放手続きが 4 倍かかるってことでしょうね。 ガベージコレクション(不要なメモリの再利用)にかかわることなので、なんとなく遅そうなイメージはあります。
2そうだね
プレイ済み
返信[14]
親投稿
MIKI ifconfig
実行ステップについては調べても何も出てきません。 プチコンのプログラムは実行に先立ちまず中間コードにコンパイルされます。(文法エラーや未定義変数参照エラーなどがチェックされる) 無事コンパイルが終わると、生成された中間コードを、インタープリタが一つ読んでは実行し、また一つ読んでは実行し・・を繰り返します。 この中間コード一つぶんの実行を1ステップと呼びました。 見たほうが早いと思い、小さなインタープリタを作りました。(一時間クオリティ) a=3/2: ?a というソースコードをコンパイルした中間コード(data文)を実行します。 コンパイルは私が手作業で行いました。 プチコンも、大枠ではこれと同じようなことをしていると思います。
3そうだね
プレイ済み
返信[15]
親投稿
ish owlis1
毎回GCがかかってるなら…確かに遅そうです。 気になったのでFILLも調査しました。ほぼ同様のスピードでした。 この手の初期化はSWAPが一番早いという結果が。使う場所が限られますでしょうが。
2そうだね
プレイ済み
返信[16]
親投稿
MIKI ifconfig
・コンパイル方法 変数=式 という命令は @var "変数名" <式のコード> @assign に変換されます。 定数は @const <定数> に変換されます。 これにより、例えば a=1 なら @var "a" @const 1 @assign に変換されます。 変数は @var "変数名" @eval に変換されます。 ? 式 は <式のコード> @print に変換されます。 よって ? a は @var "a" @eval @print に変換されます。 式1 / 式2 は <式1のコード> <式2のコード> @div に変換されます。 掛け算を実装するなら、式1 * 式2 を <式1> <式2> @mul とかに変換すればいいです。
2そうだね
プレイ済み
返信[17]
親投稿
3で、"A"を"A"*120にすると少し早くなります。 定数を代入するより、定数をINCする方が早い。 何でだろう。
2そうだね
プレイ済み
返信[18]
親投稿
MIKI ifconfig
・インタープリタ 1. read で命令(@ラベル)を読んできます。 2. gosub @ラベル で命令の処理に分岐します。 3. goto 1 命令表 @end: インタープリタを停止します。 @print: 値スタックから値を pop し、表示します。 @const: 次の data が値なので、それを read して値スタックにpushします。 @var: 次の data が変数命なので、それを read して変数名スタックに push します。 @eval: 変数スタックから変数名を pop し、それの値を値スタックに push します。 @assign: 値スタックに代入値、変数名スタックに変数名が入っているので、それぞれ pop して変数に代入します。 @div: 値スタックに <式2> <式1> の順で入っているので、それぞれ pop し、除算した結果を値スタックに積みます
2そうだね
プレイ済み
返信[19]
親投稿
スー thanks_0u0
へぇー、プチコンさんこんなことしてるんですね。確かに変数で2ステップ、定数や演算子で1ステップですね、わかりやすいですー(・ω・) そしてそれをプチコンで組むとプチコンがまたコンパイルしてインタプリタが実行していくという。。。絵を描く人を描く人、みたいな図が頭の中に。
0そうだね
プレイ済み
返信[20]
親投稿
スー thanks_0u0
メインループで使う分にはGOTOが一番早そうかもです?(・~・) IFをやめて条件式をマトモに書いたらREPEATの方が早いのでしょうか。
0そうだね
プレイ済み
返信[21]
親投稿
スー thanks_0u0
IFをやめたらREPEATの方が早くなりましたー。普通はGOTOで組んで、どうしても速度が必要な時はREPEAT、って感じでしょうか。
0そうだね
プレイ済み
返信[22]
親投稿
myu314 myu314
==より<=や>=の方が速かったりするので REPEAT:I=I+1:UNTIL I>=1000000 とか書くほうが速いです…といってもループ回数が数万超えるようなケースじゃないと差はわかんないでしょうけども:) 配列を1次元にするかどうかは、ある領域を左上から順に見ていくことが良くあるかどうかで決まる気がします。 お絵かきツールで四角描画するようなルーチンみたいなの。 アクションゲームだとそゆことあんまりやらないから、座標からインデックスに変換する手間もあってそれほど高速化効かないんじゃないかなーと。
2そうだね
プレイ済み