制作日記

こういうの作った方が、逃げにくいじゃない

trigger参照

http://drabs.blog40.fc2.com/blog-entry-985.html
上生地の通り、大分前に実験結果とメモリ上の値から予測書いたけけど、
アセンブラで軽く確認してみた
ここが問題の個所、一個目の命令のアドレスが0040900Ah

add ecx, 10h
inc edi
mov eax, ecx
add eax, [esi+18h]
cmp [eax+08h], edx
jne 0040900Ah
cmp [eax+0Ch], ebp
jne 0040900Ah

ここで、triggerX中のY番目のtriggerを捜してる
探してるtriggerのXがedxに、Yがedpに記録されてる
上記事でも書いたけど、triggerの番号の情報は0x10バイトの構造体の配列で管理されてる
オフセット0x8バイト((eax+08h])にX、オフセット0xCバイト([eax+0Ch])にYが記録されてる

cmpで値を比較して、jneで値が異なる(not equal)なら冒頭の命令にジャンプ、同値ならそのまま次の命令へ
毎回アホみたいに構造体の配列の先頭から調べてるから、計算量がtriggerの数の2乗に比例する

このtrigger番号管理してる構造体の配列はXの昇順で整列されてるから、
trigger1がほぼ間違いなくが真になるなら、trigger2とか3がアホほど多くても、基本的には問題はない

ただしtriggerallのXは-1として処理されてて、しかも配列一番後ろに配置される
つまり一番ループ数が多くなるのはtriggerallを捜すとき
だから上記の場合でもtriggerallがあったりすると、ほんの少し重くなる
重くなるって言ってもマイクロ秒とかのレベルでだけど


http://drabs.blog40.fc2.com/blog-entry-427.html
の最後の方でtriggerallの方が重そうって書いたけど、整列順が原因だったわけだ

コメントの投稿

非公開コメント

プロフィール

Author:drab
霊夢改変キャラ
「12 3 ! {V} [_]」
公開中
L霊夢でもl_reimuでも好きなように読んでください

最新記事
最新コメント
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク