2019年4月27日土曜日

LSLバックステージがネット上から消えたので 要約掲載 高速化編

のでまぁテクニックのところだけでも抜粋して
何回かに分けて乗っけとくこととする

でまぁ更に適当に抜粋に抜粋して要約する

3.1高速化手法

3.1.1定数演算は演算結果を書く

なんかLSLコンパイラで計算結果が変わらない定数演算も
そのままアセンブラコードにしちゃうらしいので
定数計算はコメントアウトして計算結果だけ代入しとけとのこと

ただこれも過剰にやると可読性が死ぬので
秒単位で演算時間が変わるような長大ループとか

ミリ秒単位で処理時間圧縮したい場合に有用

ワイの場合メモリに余裕あれば初期化処理してグローバル変数にぶっこむかな

変数間移動とハードコーディング数値の代入では前者が早い

3.1.2ループ中で計算結果の変わらない異処理はループの外に出す

for文とかで比較対象の固定数値をいちいちllList2とか使うと
なんかループの回数分list2が実行されちゃうらしく

先に変数に代入しとけということのようだ

これはllList2系命令の処理の食われ方からしても妥当やな


まぁこれもうちょい短縮方法ある

Listに対して固定でなんかするループ処理の場合
リスト長の変数自体をインクリメントなりデクリメントなりして
whileでぶん回すと結構な短縮になる

llist length = llGetListLength(Holge);

do{
    (何らかの処理)
    --length;
}while(hoge>-1);

これまぁリンクセットダンプとかでも使える


3.1.3 短い処理は インライン展開

なんでもかんでも関数定義して投げるなって話っぽい

概ね10演算子辺りがボーダーらしいので

複数箇所から呼び出すことがわかってる処理以外は
可能な限りユーザー関数使うなみたいな感じだな

これも秒オーダーで処理時間変わるループや
ミリ秒オーダーでイベント終わらせる必要がある場合以外は
割と無視していいが 最後の詰めに使えるな


3.1.4 インクリメント・デクリメント

i++;
より
++i;
の方がアセンブラコードになったときに2命令文圧縮できるとのこと
これは普段使いではくせにしちゃっていいと思う

で更に

ビット反転した後に符号反転すると+1したことになるとかで

a=-(~a); // ++a と等価

符号反転してからビット反転すると-1したことになるとかで

b=~(-b); // --b と等価


という記述方法が紹介されているけど
これも山ほど動かしたり
ミリ秒オーダーじゃないかぎりそこまでは不要かなぁ


3.1.5 ローカル変数は宣言時に初期化する

これはまぁちょっとわかりにくいな

ゼロやNULLで宣言しておく分には関係ない話
特定の数値代入して初期化する際に
宣言と代入と分けずに 宣言即代入したほうが早い

integer i;
i=5;

とするより

integer i =5;

こっちのほうが2命令文早いとのこと

これもミ(ry

3.1.6 同じ値を複数の変数に代入

同じ数値なら=でチェーン記述したほうがええということらしい

a = 0;
b = 0;

よりも

a = b = 0;

のほうが効率的とのこと

3.1.7 ローカル変数VSグローバル変数

ローカル変数の方が確保と開放の処理分ちょい重いとのこと

これは体感としてスタックヒープコリジョンの対策でちょい有効
ループカウンタの変数とか文字列入れる一時変数とか
その辺をグローバル定義するとメモリ圧縮になることもなる


3.1.8 リストへの値の追加

リストへ値を一つ追加する場合は []で囲わなくても
そのまま+=でいけるとのこと

これもリスト初期化処理とかで便利かなぁというところだけど
可読性とのトレードオフがあるから使い所は選ぶね

3.1.9 文字列定数、リスト定数のグローバル変数宣言

これもあれだな グローバル変数定義だと
ローカル変数定義時みたいに確保と削除が無い分

ポインタ参照的な挙動になって高速化するというやつだな

1.0.10 ビット演算を用いた、条件判定の高速化

ちょっとこれ要約するの無理だなぁ
integer値が32までならビット演算で複数の範囲判定が同時に行えるという話

3.1.11 list の長さの非0 判定

listの長さがゼロで無い判定
(lst!=[])
listの長さがゼロの判定
(lst==[])

3.1.12 llGetListLength() [互換性に注意]

ちょっとこれ衝撃だなぁ

integer len = llGetListLength(a);
これは
integer len = (a != []);

こう置き換え可能で listの!=演算が単純なブーリアン値ではなく
リストの長さの差分を計算するプログラムになってるんだってさ

で更に空リストをグローバル変数定義すれば高速化するとのこと

list null_list = []; // グローバル変数として宣言しておく
integer len = (a!=null_list);

ただしこの処理自体を関数化すると相殺されるらしいので
使い所ってことだと結構微妙かなぁ

でまぁこれこれちょっと今使えるかどうかわかんないなぁ


//-------------------------------------------------------------------------------

高速化の章の話はこれで終わり

常用するのはインクリメント・デクリメントと
あと代入処理のチェーンくらいかなぁ

計算結果定数の記述はまぁ詰めでやるくらいでいいかねと


以上

0 件のコメント:

コメントを投稿