何回かに分けて乗っけとくこととする
でまぁ更に適当に抜粋に抜粋して要約する
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;
とするより
こっちのほうが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);
ただしこの処理自体を関数化すると相殺されるらしいので
使い所ってことだと結構微妙かなぁ
でまぁこれこれちょっと今使えるかどうかわかんないなぁ
//-------------------------------------------------------------------------------
高速化の章の話はこれで終わり
常用するのはインクリメント・デクリメントと
あと代入処理のチェーンくらいかなぁ
計算結果定数の記述はまぁ詰めでやるくらいでいいかねと
以上