by konisi » 2007年1月03日(水) 22:46
コード: 全て選択
Dim A(100000) As String
というコードだけでファイルサイズが8.42MBって言うのは少し大きすぎやしないでしょうか^^;
コンパイルの速度も少し落ちたような気がします。
調べてみると、AB5系では次のようなコードが生成されています。
コード: 全て選択
XOR ECX,ECX
PUSH ECX
PUSH 00h
PUSH 00h
POP EAX
IMUL EAX,EAX,00000001h
ADD dword ptr[ESP],EAX
POP EAX
IMUL EAX,EAX,00000008h
POP ECX
ADD ECX,EAX
LEA EAX,[ECX+C6C724h]
MOV ECX,EAX
PUSH ECX
CALL _A
これが延々と。
せめてこう書き直したほうが良いのではないかという案。
コード: 全て選択
PUSH 0C6C724h
CALL _A
と言うより、省略できるところをどんどん省略して行ったらこんなに小さくなっちゃったんですが、
自動化のほう、どうなっているんでしょうか山本さん。
追記:実行箇所がどこに飛ばされているかと言う点と、それの最適化案について。
コード: 全て選択
;生成されるコード
_A:
SUB ESP,00000000h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
PUSH 01h
CALL _B
PUSH EAX
MOV ECX,dword ptr[EBP+08h]
ADD ECX,00000004h
POP EAX
MOV dword ptr[ECX],EAX
PUSH 00h
MOV ECX,dword ptr[EBP+08h]
POP EAX
MOV dword ptr[ECX],EAX
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+00h
RET 0004h
_B:
SUB ESP,00000004h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
PUSH 00h
PUSH 04h
MOV EAX,EBP
ADD EAX,00000004h
PUSH EAX
CALL dword ptr[KERNEL32.RtlFillMemory]
PUSH dword ptr[EBP+0Ch]
PUSH 08h
PUSH dword ptr[offset D]
CALL dword ptr[KERNEL32.HeapAlloc]
PUSH EAX
POP EAX
MOV dword ptr[EBP+04h],EAX
JMP _C
_C:
MOV EAX,dword ptr[EBP+04h]
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+04h
RET 0004h
コード: 全て選択
;最適化してみたコード
_A:
SUB ESP,00000000h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI;ここまでは関数の定石なのでここは削らない。ただし残す必要性は薄い。以下略。
;EAX,ECXは_B先でも現在の値が参照されないので初期化はしない。
PUSH 01h
CALL _B
MOV ECX,dword ptr[EBP+08h]
MOV dword ptr[ECX+04h],EAX
XOR EAX,EAX
MOV ECX,dword ptr[EBP+08h]
MOV dword ptr[ECX],EAX
POP EDI;ここから関数の定石なので削らない。
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+00h
RET 0004h
_B:
SUB ESP,00000004h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI;ここまで関数の定石なので削らない。
PUSH 00h
PUSH 04h
MOV EAX,EBP
ADD EAX,00000004h
PUSH EAX
CALL dword ptr[KERNEL32.RtlFillMemory]
PUSH dword ptr[EBP+0Ch]
PUSH 08h
PUSH dword ptr[offset D]
CALL dword ptr[KERNEL32.HeapAlloc]
MOV dword ptr[EBP+04h],EAX
POP EDI;ここから関数の定石なので削らない。
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+04h
RET 0004h
[code]Dim A(100000) As String[/code]というコードだけでファイルサイズが8.42MBって言うのは少し大きすぎやしないでしょうか^^;
コンパイルの速度も少し落ちたような気がします。
調べてみると、AB5系では次のようなコードが生成されています。[code] XOR ECX,ECX
PUSH ECX
PUSH 00h
PUSH 00h
POP EAX
IMUL EAX,EAX,00000001h
ADD dword ptr[ESP],EAX
POP EAX
IMUL EAX,EAX,00000008h
POP ECX
ADD ECX,EAX
LEA EAX,[ECX+C6C724h]
MOV ECX,EAX
PUSH ECX
CALL _A[/code]これが延々と。
せめてこう書き直したほうが良いのではないかという案。[code] PUSH 0C6C724h
CALL _A[/code]
と言うより、省略できるところをどんどん省略して行ったらこんなに小さくなっちゃったんですが、
自動化のほう、どうなっているんでしょうか山本さん。
追記:実行箇所がどこに飛ばされているかと言う点と、それの最適化案について。[code];生成されるコード
_A:
SUB ESP,00000000h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
PUSH 01h
CALL _B
PUSH EAX
MOV ECX,dword ptr[EBP+08h]
ADD ECX,00000004h
POP EAX
MOV dword ptr[ECX],EAX
PUSH 00h
MOV ECX,dword ptr[EBP+08h]
POP EAX
MOV dword ptr[ECX],EAX
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+00h
RET 0004h
_B:
SUB ESP,00000004h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI
PUSH 00h
PUSH 04h
MOV EAX,EBP
ADD EAX,00000004h
PUSH EAX
CALL dword ptr[KERNEL32.RtlFillMemory]
PUSH dword ptr[EBP+0Ch]
PUSH 08h
PUSH dword ptr[offset D]
CALL dword ptr[KERNEL32.HeapAlloc]
PUSH EAX
POP EAX
MOV dword ptr[EBP+04h],EAX
JMP _C
_C:
MOV EAX,dword ptr[EBP+04h]
POP EDI
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+04h
RET 0004h
[/code][code];最適化してみたコード
_A:
SUB ESP,00000000h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI;ここまでは関数の定石なのでここは削らない。ただし残す必要性は薄い。以下略。
;EAX,ECXは_B先でも現在の値が参照されないので初期化はしない。
PUSH 01h
CALL _B
MOV ECX,dword ptr[EBP+08h]
MOV dword ptr[ECX+04h],EAX
XOR EAX,EAX
MOV ECX,dword ptr[EBP+08h]
MOV dword ptr[ECX],EAX
POP EDI;ここから関数の定石なので削らない。
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+00h
RET 0004h
_B:
SUB ESP,00000004h
PUSH EBP
MOV EBP,ESP
PUSH EBX
PUSH ESI
PUSH EDI;ここまで関数の定石なので削らない。
PUSH 00h
PUSH 04h
MOV EAX,EBP
ADD EAX,00000004h
PUSH EAX
CALL dword ptr[KERNEL32.RtlFillMemory]
PUSH dword ptr[EBP+0Ch]
PUSH 08h
PUSH dword ptr[offset D]
CALL dword ptr[KERNEL32.HeapAlloc]
MOV dword ptr[EBP+04h],EAX
POP EDI;ここから関数の定石なので削らない。
POP ESI
POP EBX
MOV ESP,EBP
POP EBP
ADD ESP,+04h
RET 0004h
[/code]