Case文とIf文
僕はIfブロックをよりよく使いますね。
理由は、Select文+Caseブロックだと文字列の分岐が出来ないからです。
Ifブロックはかなりの量まで分岐も出来るし、文字列判定も楽なので。
理由は、Select文+Caseブロックだと文字列の分岐が出来ないからです。
Ifブロックはかなりの量まで分岐も出来るし、文字列判定も楽なので。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
分岐限界を調べてみた。
暇だったので調べてみました。
さらに調べると、Case文の場合の分岐限界は963個、If文の場合の分岐限界は1370個でした。ただし、If文を使う方がCase文を使うときより1.4倍ほどソースコードが膨れました。また、分岐する数が同じ場合にCase文を使う方がIf文を使うそれよりコンパイル後のファイルサイズが小さくなる事がある事が分かりました。これについては後でじっくり調べたいと思います。ちなみに、コンパイルにかかった時間は同程度でした。
環境によってはCase文やIf文の分岐限界が高い事もありえます。誰か別途報告頼みます。
CPU:Pentium4 3.0GHz
OS:WinXP SP2
追記
Case文とIf文において色々と調べたら分かった事があります。
Case文の場合は最初に全て分岐して、それから動作するので構造は並列っぽいし、予想される動作速度もIf文の2倍程度(メモリへのアクセス回数等から計算)と軽快です。ですがジャンプ先などを全て把握しておかなければならないので分岐数の限界がIf文に劣るものと思います。
これに対してIf文の場合は分岐しながら進み、条件式が真の時に動作を始めるので構造は直列っぽいし、Case文に比べればメモリへのアクセスを頻繁に行うため動作がやや鈍るものと予測します。ただしEndIf文が置かれている場所+αくらいしか把握するべき事柄が無いため、分岐数の限界がCase文に勝るものと思います。
つまり
IfよりCaseの方が実行速度は速くできるけど、If文に比べたらあまり大量に分岐できるわけではないって言うことかな。
[ここをクリックすると内容が表示されます]
で、結果はL(分岐数)=100の時両方コンパイルが通る、L=1000のときIf文を使った方はコンパイルが通るがCase文を使った方はコンパイルが通らない、L=10000のとき両方ともともにコンパイルが通らない という結果になりました。ソースファイル出力プログラム
コード: 全て選択
#console
Const L=1000
Dim A$ As String
Dim I As Long
A$="Case"+Str$(L)+".abp"
Open A$ For Output As #1
Print #1,"Dim I As Long"
Print #1,"Select Case I"
For I=1 To L
A$=" Case "+Str$(I)
Print #1,A$
A$=" Nop()"
Print #1,A$
Next I
Print #1,"End Select"
Print #1,"Sub Nop()"
Print #1,"End Sub"
Close #1
A$="If"+Str$(L)+".abp"
Open A$ For Output As #1
Print #1,"Dim I As Long"
Print #1,"If I=0 then"
Print #1," Nop()"
For I=1 To L
A$=" ElseIf I="+Str$(I)+" then"
Print #1,A$
A$=" Nop()"
Print #1,A$
Next I
Print #1,"End If"
Print #1,"Sub Nop()"
Print #1,"End Sub"
Close #1
さらに調べると、Case文の場合の分岐限界は963個、If文の場合の分岐限界は1370個でした。ただし、If文を使う方がCase文を使うときより1.4倍ほどソースコードが膨れました。また、分岐する数が同じ場合にCase文を使う方がIf文を使うそれよりコンパイル後のファイルサイズが小さくなる事がある事が分かりました。これについては後でじっくり調べたいと思います。ちなみに、コンパイルにかかった時間は同程度でした。
環境によってはCase文やIf文の分岐限界が高い事もありえます。誰か別途報告頼みます。
CPU:Pentium4 3.0GHz
OS:WinXP SP2
追記
Case文とIf文において色々と調べたら分かった事があります。
Case文の場合は最初に全て分岐して、それから動作するので構造は並列っぽいし、予想される動作速度もIf文の2倍程度(メモリへのアクセス回数等から計算)と軽快です。ですがジャンプ先などを全て把握しておかなければならないので分岐数の限界がIf文に劣るものと思います。
これに対してIf文の場合は分岐しながら進み、条件式が真の時に動作を始めるので構造は直列っぽいし、Case文に比べればメモリへのアクセスを頻繁に行うため動作がやや鈍るものと予測します。ただしEndIf文が置かれている場所+αくらいしか把握するべき事柄が無いため、分岐数の限界がCase文に勝るものと思います。
つまり
IfよりCaseの方が実行速度は速くできるけど、If文に比べたらあまり大量に分岐できるわけではないって言うことかな。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。
ちなみに、空関数を呼ぶときのコストが呼び出し部分で10クロック、内部処理で24クロック、リターン部分で5クロック、合計39クロックでした。
はい、どうでもいい話です。
ちなみに、空関数を呼ぶときのコストが呼び出し部分で10クロック、内部処理で24クロック、リターン部分で5クロック、合計39クロックでした。
はい、どうでもいい話です。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
中々面白そうな話題ですね。> 厳密に調べなおしたら、Case文を使う方は分岐する時のコストが14クロック、If文のときは31クロックでした。また、分岐しない場合の通過処理コストがCase文の場合11クロック、If文の場合は27クロックでした。
Select Case文の方が速いって話はよく聞いてましたが、具体的なクロック数は知りませんでしたね。
Select Case文を次のように書き直せばIf文と同じようなクロック数になるんでしょうかね?
コード: 全て選択
Dim a As Long
Input "a=",a
Select Case (a=>0)
Case -1
Print "aは自然数である。"
Case 0
Print "aは自然数ではない。"
End Select
比較対象があれば確認しますが・・・
なんかライタが同じじゃないと少しだけ気になるのでね^^;
まぁ暇なので同等のプログラムを作りつつConsoleモードでのPrint関数がどのくらい処理コストがかかるのかを調べてみました。
そういえば、同等のプログラムを書いたら単位処理が重いIf文のほうがクロック数が高くなると思うのですが^^;>>NoWest氏
追記 2006/05/23 21:50
402CE0番地は下請けを含めずに計算すると296クロックでした。また、ここから一度だけ4030AB番地に飛んで、2回401944番地に飛んでいます。ただし401944番地で始まる場所は分岐が多いので最大クロック数と最低クロック数を求めるのに一苦労しそうです。
4030AB番地は下請けを含めずに計算すると338~396クロックです。値が不定なのは掛け算にかかる時間が不定だからです。また、これ以下の下請けはありませんでした。
総クロック数を計算すると、401944番地を計算に含めないなら1360~1534クロックでした。
なんかライタが同じじゃないと少しだけ気になるのでね^^;
まぁ暇なので同等のプログラムを作りつつConsoleモードでのPrint関数がどのくらい処理コストがかかるのかを調べてみました。
逆アセンブルしたものからPrint文の主要部分のみを摘出 [ここをクリックすると内容が表示されます]
数えてみると呼び出し部分だけで50クロックあります。下請けの4030AB番地と402CE0番地のほうは長いのであとで追記という形でクロック数を載せようかと思います。
使用ソフト:xdawin
ptrでの参照先は逆汗が面倒なのでやめましたが、2回参照されている004030AB番地は楽なのでそれをとりあえず下に出します。
ついでに、1回だけ最後のほうで参照されている00402CE0番地↓
そして上の番地から参照されている401944番地↓
コード: 全て選択
40125F 68 03604000 PUSH 00406003h ; h.`@.
401264 68 15604000 PUSH 00406015h ; h.`@.
401269 8B0424 MOV EAX,dword ptr[ESP] ; ..$
40126C 50 PUSH EAX ; P
40126D 50 PUSH EAX ; P
40126E FF15 D6514000 CALL dword ptr[4051D6h] ;<==>[4051D6h] ..ヨQ@.
401274 50 PUSH EAX ; P
401275 E8 311E0000 CALL _004030AB ;<---------->v 004030AB ・...
40127A 50 PUSH EAX ; P
40127B FF15 DA514000 CALL dword ptr[4051DAh] ;<==>[4051DAh] ..レQ@.
401281 890424 MOV dword ptr[ESP],EAX ; ..$
401284 8B4424 04 MOV EAX,dword ptr[ESP+04h] ; 汽$.
401288 50 PUSH EAX ; P
401289 50 PUSH EAX ; P
40128A FF15 D6514000 CALL dword ptr[4051D6h] ;<==>[4051D6h] ..ヨQ@.
401290 50 PUSH EAX ; P
401291 E8 151E0000 CALL _004030AB ;<---------->v 004030AB .....
401296 50 PUSH EAX ; P
401297 FF15 DA514000 CALL dword ptr[4051DAh] ;<==>[4051DAh] ..レQ@.
40129D 894424 04 MOV dword ptr[ESP+04h],EAX ; 吋$.
4012A1 E8 3A1A0000 CALL _00402CE0 ;<---------->v 00402CE0 ・...
4012A6 50 PUSH EAX ; P
コード: 全て選択
_004030AB 81EC 04000000 SUB ESP,00000004h ; ・....
4030B1 55 PUSH EBP ; U
4030B2 8BEC MOV EBP,ESP ; 駆
4030B4 53 PUSH EBX ; S
4030B5 56 PUSH ESI ; V
4030B6 57 PUSH EDI ; W
4030B7 6A 00 PUSH 00h ; j.
4030B9 6A 04 PUSH 04h ; j.
4030BB 8BC5 MOV EAX,EBP ; 暁
4030BD 05 04000000 ADD EAX,00000004h ; .....
4030C2 50 PUSH EAX ; P
4030C3 FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
4030C9 6A 04 PUSH 04h ; j.
4030CB FFB5 0C000000 PUSH dword ptr[EBP+0Ch] ; .オ....
4030D1 5B POP EBX ; [
4030D2 58 POP EAX ; X
4030D3 83EC 04 SUB ESP,+04h ; ・.
4030D6 03C3 ADD EAX,EBX ; .テ
4030D8 890424 MOV dword ptr[ESP],EAX ; ..$
4030DB 6A 01 PUSH 01h ; j.
4030DD 5B POP EBX ; [
4030DE 58 POP EAX ; X
4030DF 83EC 04 SUB ESP,+04h ; ・.
4030E2 03C3 ADD EAX,EBX ; .テ
4030E4 890424 MOV dword ptr[ESP],EAX ; ..$
4030E7 6A 08 PUSH 08h ; j.
4030E9 FF35 34704000 PUSH dword ptr[407034h] ; .54p@.
4030EF FF15 F6514000 CALL dword ptr[4051F6h] ;<==>[4051F6h] ..・@.
4030F5 50 PUSH EAX ; P
4030F6 6A 04 PUSH 04h ; j.
4030F8 5B POP EBX ; [
4030F9 58 POP EAX ; X
4030FA 83EC 04 SUB ESP,+04h ; ・.
4030FD 03C3 ADD EAX,EBX ; .テ
4030FF 890424 MOV dword ptr[ESP],EAX ; ..$
403102 58 POP EAX ; X
403103 8985 04000000 MOV dword ptr[EBP+04h],EAX ; 怨....
403109 FFB5 04000000 PUSH dword ptr[EBP+04h] ; .オ....
40310F 6A 04 PUSH 04h ; j.
403111 5B POP EBX ; [
403112 58 POP EAX ; X
403113 83EC 04 SUB ESP,+04h ; ・.
403116 2BC3 SUB EAX,EBX ; +テ
403118 890424 MOV dword ptr[ESP],EAX ; ..$
40311B FFB5 0C000000 PUSH dword ptr[EBP+0Ch] ; .オ....
403121 5B POP EBX ; [
403122 58 POP EAX ; X
403123 8918 MOV dword ptr[EAX],EBX ; ..
403125 B8 1C704000 MOV EAX,0040701Ch ; ク.p@.
40312A 50 PUSH EAX ; P
40312B FF15 FE514000 CALL dword ptr[4051FEh] ;<==>[4051FEh] ...Q@.
403131 33C9 XOR ECX,ECX ; 3ノ
403133 81C1 04000000 ADD ECX,00000004h ; ・....
403139 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
40313F 6A 01 PUSH 01h ; j.
403141 5B POP EBX ; [
403142 58 POP EAX ; X
403143 83EC 04 SUB ESP,+04h ; ・.
403146 03C3 ADD EAX,EBX ; .テ
403148 890424 MOV dword ptr[ESP],EAX ; ..$
40314B 6A 04 PUSH 04h ; j.
40314D 5B POP EBX ; [
40314E 58 POP EAX ; X
40314F 83EC 04 SUB ESP,+04h ; ・.
403152 0FAFC3 IMUL EAX,EBX ; .ッテ
403155 890424 MOV dword ptr[ESP],EAX ; ..$
403158 33C9 XOR ECX,ECX ; 3ノ
40315A FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
403160 6A 00 PUSH 00h ; j.
403162 FF35 34704000 PUSH dword ptr[407034h] ; .54p@.
403168 FF15 CA514000 CALL dword ptr[4051CAh] ;<==>[4051CAh] ..ハQ@.
40316E 50 PUSH EAX ; P
40316F 33C9 XOR ECX,ECX ; 3ノ
403171 58 POP EAX ; X
403172 8981 14704000 MOV dword ptr[ECX+407014h],EAX ; 堰.p@.
403178 33C9 XOR ECX,ECX ; 3ノ
40317A FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
403180 33C9 XOR ECX,ECX ; 3ノ
403182 81C1 04000000 ADD ECX,00000004h ; ・....
403188 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
40318E B8 04000000 MOV EAX,00000004h ; ク....
403193 50 PUSH EAX ; P
403194 5B POP EBX ; [
403195 58 POP EAX ; X
403196 83EC 04 SUB ESP,+04h ; ・.
403199 0FAFC3 IMUL EAX,EBX ; .ッテ
40319C 890424 MOV dword ptr[ESP],EAX ; ..$
40319F 5B POP EBX ; [
4031A0 58 POP EAX ; X
4031A1 83EC 04 SUB ESP,+04h ; ・.
4031A4 03C3 ADD EAX,EBX ; .テ
4031A6 890424 MOV dword ptr[ESP],EAX ; ..$
4031A9 FFB5 04000000 PUSH dword ptr[EBP+04h] ; .オ....
4031AF 5B POP EBX ; [
4031B0 58 POP EAX ; X
4031B1 8918 MOV dword ptr[EAX],EBX ; ..
4031B3 33C9 XOR ECX,ECX ; 3ノ
4031B5 81C1 04000000 ADD ECX,00000004h ; ・....
4031BB FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
4031C1 6A 01 PUSH 01h ; j.
4031C3 5B POP EBX ; [
4031C4 58 POP EAX ; X
4031C5 83EC 04 SUB ESP,+04h ; ・.
4031C8 03C3 ADD EAX,EBX ; .テ
4031CA 890424 MOV dword ptr[ESP],EAX ; ..$
4031CD 33C9 XOR ECX,ECX ; 3ノ
4031CF 81C1 04000000 ADD ECX,00000004h ; ・....
4031D5 58 POP EAX ; X
4031D6 8981 14704000 MOV dword ptr[ECX+407014h],EAX ; 堰.p@.
4031DC B8 1C704000 MOV EAX,0040701Ch ; ク.p@.
4031E1 50 PUSH EAX ; P
4031E2 FF15 F2514000 CALL dword ptr[4051F2h] ;<==>[4051F2h] ..餔@.
4031E8 8B85 04000000 MOV EAX,dword ptr[EBP+04h] ; 球....
4031EE 5F POP EDI ; _
4031EF 5E POP ESI ; ^
4031F0 5B POP EBX ; [
4031F1 8BE5 MOV ESP,EBP ; 句
4031F3 5D POP EBP ; ]
4031F4 83C4 04 ADD ESP,+04h ; ζ.
4031F7 C2 0400 RET 0004h ;<=====,ESP+=0004h ツ..
コード: 全て選択
_00402CE0 81EC 10000000 SUB ESP,00000010h ; ・....
402CE6 55 PUSH EBP ; U
402CE7 8BEC MOV EBP,ESP ; 駆
402CE9 53 PUSH EBX ; S
402CEA 56 PUSH ESI ; V
402CEB 57 PUSH EDI ; W
402CEC 6A 00 PUSH 00h ; j.
402CEE 6A 04 PUSH 04h ; j.
402CF0 8BC5 MOV EAX,EBP ; 暁
402CF2 05 10000000 ADD EAX,00000010h ; .....
402CF7 50 PUSH EAX ; P
402CF8 FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
402CFE 6A 00 PUSH 00h ; j.
402D00 6A 04 PUSH 04h ; j.
402D02 8BC5 MOV EAX,EBP ; 暁
402D04 05 0C000000 ADD EAX,0000000Ch ; .....
402D09 50 PUSH EAX ; P
402D0A FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
402D10 6A 00 PUSH 00h ; j.
402D12 6A 04 PUSH 04h ; j.
402D14 8BC5 MOV EAX,EBP ; 暁
402D16 05 08000000 ADD EAX,00000008h ; .....
402D1B 50 PUSH EAX ; P
402D1C FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
402D22 6A 00 PUSH 00h ; j.
402D24 6A 04 PUSH 04h ; j.
402D26 8BC5 MOV EAX,EBP ; 暁
402D28 05 04000000 ADD EAX,00000004h ; .....
402D2D 50 PUSH EAX ; P
402D2E FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
402D34 FFB5 1C000000 PUSH dword ptr[EBP+1Ch] ; .オ....
402D3A 6A 04 PUSH 04h ; j.
402D3C 5B POP EBX ; [
402D3D 58 POP EAX ; X
402D3E 83EC 04 SUB ESP,+04h ; ・.
402D41 2BC3 SUB EAX,EBX ; +テ
402D43 890424 MOV dword ptr[ESP],EAX ; ..$
402D46 58 POP EAX ; X
402D47 8B00 MOV EAX,dword ptr[EAX] ; ..
402D49 50 PUSH EAX ; P
402D4A 58 POP EAX ; X
402D4B 8985 08000000 MOV dword ptr[EBP+08h],EAX ; 怨....
402D51 FFB5 18000000 PUSH dword ptr[EBP+18h] ; .オ....
402D57 6A 04 PUSH 04h ; j.
402D59 5B POP EBX ; [
402D5A 58 POP EAX ; X
402D5B 83EC 04 SUB ESP,+04h ; ・.
402D5E 2BC3 SUB EAX,EBX ; +テ
402D60 890424 MOV dword ptr[ESP],EAX ; ..$
402D63 58 POP EAX ; X
402D64 8B00 MOV EAX,dword ptr[EAX] ; ..
402D66 50 PUSH EAX ; P
402D67 58 POP EAX ; X
402D68 8985 04000000 MOV dword ptr[EBP+04h],EAX ; 怨....
402D6E FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
402D74 FFB5 04000000 PUSH dword ptr[EBP+04h] ; .オ....
402D7A 5B POP EBX ; [
402D7B 58 POP EAX ; X
402D7C 83EC 04 SUB ESP,+04h ; ・.
402D7F 03C3 ADD EAX,EBX ; .テ
402D81 890424 MOV dword ptr[ESP],EAX ; ..$
402D84 E8 22030000 CALL _004030AB ;<---------->v 004030AB ・...
402D89 50 PUSH EAX ; P
402D8A 58 POP EAX ; X
402D8B 8985 0C000000 MOV dword ptr[EBP+0Ch],EAX ; 怨....
402D91 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
402D97 FFB5 1C000000 PUSH dword ptr[EBP+1Ch] ; .オ....
402D9D FFB5 0C000000 PUSH dword ptr[EBP+0Ch] ; .オ....
402DA3 FF15 DE514000 CALL dword ptr[4051DEh] ;<==>[4051DEh] ..゙Q@.
402DA9 FFB5 04000000 PUSH dword ptr[EBP+04h] ; .オ....
402DAF FFB5 18000000 PUSH dword ptr[EBP+18h] ; .オ....
402DB5 FFB5 0C000000 PUSH dword ptr[EBP+0Ch] ; .オ....
402DBB FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
402DC1 5B POP EBX ; [
402DC2 58 POP EAX ; X
402DC3 83EC 04 SUB ESP,+04h ; ・.
402DC6 03C3 ADD EAX,EBX ; .テ
402DC8 890424 MOV dword ptr[ESP],EAX ; ..$
402DCB FF15 DE514000 CALL dword ptr[4051DEh] ;<==>[4051DEh] ..゙Q@.
402DD1 FFB5 1C000000 PUSH dword ptr[EBP+1Ch] ; .オ....
402DD7 E8 68EBFFFF CALL _00401944 ;<---------->^ 00401944 鑄・.
402DDC FFB5 18000000 PUSH dword ptr[EBP+18h] ; .オ....
402DE2 E8 5DEBFFFF CALL _00401944 ;<---------->^ 00401944 鐓・.
402DE7 FFB5 0C000000 PUSH dword ptr[EBP+0Ch] ; .オ....
402DED 58 POP EAX ; X
402DEE 8985 10000000 MOV dword ptr[EBP+10h],EAX ; 怨....
402DF4 8B85 10000000 MOV EAX,dword ptr[EBP+10h] ; 球....
402DFA 5F POP EDI ; _
402DFB 5E POP ESI ; ^
402DFC 5B POP EBX ; [
402DFD 8BE5 MOV ESP,EBP ; 句
402DFF 5D POP EBP ; ]
402E00 83C4 10 ADD ESP,+10h ; ζ.
402E03 C2 0800 RET 0008h ;<=====,ESP+=0008h ツ..
コード: 全て選択
_00401944 81EC 08000000 SUB ESP,00000008h ; ・....
40194A 55 PUSH EBP ; U
40194B 8BEC MOV EBP,ESP ; 駆
40194D 53 PUSH EBX ; S
40194E 56 PUSH ESI ; V
40194F 57 PUSH EDI ; W
401950 6A 00 PUSH 00h ; j.
401952 6A 04 PUSH 04h ; j.
401954 8BC5 MOV EAX,EBP ; 暁
401956 05 08000000 ADD EAX,00000008h ; .....
40195B 50 PUSH EAX ; P
40195C FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
401962 6A 00 PUSH 00h ; j.
401964 6A 04 PUSH 04h ; j.
401966 8BC5 MOV EAX,EBP ; 暁
401968 05 04000000 ADD EAX,00000004h ; .....
40196D 50 PUSH EAX ; P
40196E FF15 EA514000 CALL dword ptr[4051EAh] ;<==>[4051EAh] ..鷁@.
401974 B8 1C704000 MOV EAX,0040701Ch ; ク.p@.
401979 50 PUSH EAX ; P
40197A FF15 FE514000 CALL dword ptr[4051FEh] ;<==>[4051FEh] ...Q@.
401980 6A 00 PUSH 00h ; j.
401982 58 POP EAX ; X
401983 8985 08000000 MOV dword ptr[EBP+08h],EAX ; 怨....
401989 E9 19000000 JMP _004019A7 ;----->v 004019A7 .....
_0040198E FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401994 6A 01 PUSH 01h ; j.
401996 5B POP EBX ; [
401997 58 POP EAX ; X
401998 83EC 04 SUB ESP,+04h ; ・.
40199B 03C3 ADD EAX,EBX ; .テ
40199D 890424 MOV dword ptr[ESP],EAX ; ..$
4019A0 58 POP EAX ; X
4019A1 8985 08000000 MOV dword ptr[EBP+08h],EAX ; 怨....
_004019A7 6A FF PUSH FFh ; j.
4019A9 58 POP EAX ; X
4019AA 83F8 00 CMP EAX,+00h ; ・.
4019AD 0F84 3C000000 JZ _004019EF ;if ZF,----->v 004019EF .・...
4019B3 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
4019B9 33C9 XOR ECX,ECX ; 3ノ
4019BB 81C1 04000000 ADD ECX,00000004h ; ・....
4019C1 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
4019C7 6A 01 PUSH 01h ; j.
4019C9 5B POP EBX ; [
4019CA 58 POP EAX ; X
4019CB 83EC 04 SUB ESP,+04h ; ・.
4019CE 2BC3 SUB EAX,EBX ; +テ
4019D0 890424 MOV dword ptr[ESP],EAX ; ..$
4019D3 5B POP EBX ; [
4019D4 58 POP EAX ; X
4019D5 83EC 04 SUB ESP,+04h ; ・.
4019D8 B9 FFFFFFFF MOV ECX,FFFFFFFFh ; ケ....
4019DD 3BC3 CMP EAX,EBX ; ;テ
4019DF 7E 05 JNG _004019E6 ;if ZF || SF!=OF,----->v 004019E6 ~.
4019E1 B9 00000000 MOV ECX,00000000h ; ケ....
_004019E6 890C24 MOV dword ptr[ESP],ECX ; ..$
4019E9 58 POP EAX ; X
4019EA E9 37000000 JMP _00401A26 ;----->v 00401A26 ・...
_004019EF FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
4019F5 33C9 XOR ECX,ECX ; 3ノ
4019F7 81C1 04000000 ADD ECX,00000004h ; ・....
4019FD FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401A03 6A 01 PUSH 01h ; j.
401A05 5B POP EBX ; [
401A06 58 POP EAX ; X
401A07 83EC 04 SUB ESP,+04h ; ・.
401A0A 2BC3 SUB EAX,EBX ; +テ
401A0C 890424 MOV dword ptr[ESP],EAX ; ..$
401A0F 5B POP EBX ; [
401A10 58 POP EAX ; X
401A11 83EC 04 SUB ESP,+04h ; ・.
401A14 B9 FFFFFFFF MOV ECX,FFFFFFFFh ; ケ....
401A19 3BC3 CMP EAX,EBX ; ;テ
401A1B 7D 05 JNL _00401A22 ;if SF==OF,----->v 00401A22 }.
401A1D B9 00000000 MOV ECX,00000000h ; ケ....
_00401A22 890C24 MOV dword ptr[ESP],ECX ; ..$
401A25 58 POP EAX ; X
_00401A26 83F8 00 CMP EAX,+00h ; ・.
401A29 0F84 D6010000 JZ _00401C05 ;if ZF,----->v 00401C05 .・...
401A2F 33C9 XOR ECX,ECX ; 3ノ
401A31 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401A37 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401A3D 6A 04 PUSH 04h ; j.
401A3F 5B POP EBX ; [
401A40 58 POP EAX ; X
401A41 83EC 04 SUB ESP,+04h ; ・.
401A44 0FAFC3 IMUL EAX,EBX ; .ッテ
401A47 890424 MOV dword ptr[ESP],EAX ; ..$
401A4A 5B POP EBX ; [
401A4B 58 POP EAX ; X
401A4C 83EC 04 SUB ESP,+04h ; ・.
401A4F 03C3 ADD EAX,EBX ; .テ
401A51 890424 MOV dword ptr[ESP],EAX ; ..$
401A54 58 POP EAX ; X
401A55 8B00 MOV EAX,dword ptr[EAX] ; ..
401A57 50 PUSH EAX ; P
401A58 58 POP EAX ; X
401A59 8985 04000000 MOV dword ptr[EBP+04h],EAX ; 怨....
401A5F FFB5 04000000 PUSH dword ptr[EBP+04h] ; .オ....
401A65 FFB5 10000000 PUSH dword ptr[EBP+10h] ; .オ....
401A6B 58 POP EAX ; X
401A6C 5B POP EBX ; [
401A6D 83EC 04 SUB ESP,+04h ; ・.
401A70 33C3 XOR EAX,EBX ; 3テ
401A72 74 05 JZ _00401A79 ;if ZF,----->v 00401A79 t.
401A74 B8 FFFFFFFF MOV EAX,FFFFFFFFh ; ク....
_00401A79 F7D0 NOT EAX ; ・
401A7B 890424 MOV dword ptr[ESP],EAX ; ..$
401A7E 58 POP EAX ; X
401A7F 83F8 00 CMP EAX,+00h ; ・.
401A82 0F84 78010000 JZ _00401C00 ;if ZF,----->v 00401C00 .з...
401A88 FFB5 10000000 PUSH dword ptr[EBP+10h] ; .オ....
401A8E 6A 04 PUSH 04h ; j.
401A90 5B POP EBX ; [
401A91 58 POP EAX ; X
401A92 83EC 04 SUB ESP,+04h ; ・.
401A95 2BC3 SUB EAX,EBX ; +テ
401A97 890424 MOV dword ptr[ESP],EAX ; ..$
401A9A 6A 00 PUSH 00h ; j.
401A9C FF35 34704000 PUSH dword ptr[407034h] ; .54p@.
401AA2 FF15 C2514000 CALL dword ptr[4051C2h] ;<==>[4051C2h] ..ツQ@.
401AA8 33C9 XOR ECX,ECX ; 3ノ
401AAA 81C1 04000000 ADD ECX,00000004h ; ・....
401AB0 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401AB6 6A 01 PUSH 01h ; j.
401AB8 5B POP EBX ; [
401AB9 58 POP EAX ; X
401ABA 83EC 04 SUB ESP,+04h ; ・.
401ABD 2BC3 SUB EAX,EBX ; +テ
401ABF 890424 MOV dword ptr[ESP],EAX ; ..$
401AC2 33C9 XOR ECX,ECX ; 3ノ
401AC4 81C1 04000000 ADD ECX,00000004h ; ・....
401ACA 58 POP EAX ; X
401ACB 8981 14704000 MOV dword ptr[ECX+407014h],EAX ; 堰.p@.
401AD1 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401AD7 58 POP EAX ; X
401AD8 8985 08000000 MOV dword ptr[EBP+08h],EAX ; 怨....
401ADE E9 19000000 JMP _00401AFC ;----->v 00401AFC .....
_00401AE3 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401AE9 6A 01 PUSH 01h ; j.
401AEB 5B POP EBX ; [
401AEC 58 POP EAX ; X
401AED 83EC 04 SUB ESP,+04h ; ・.
401AF0 03C3 ADD EAX,EBX ; .テ
401AF2 890424 MOV dword ptr[ESP],EAX ; ..$
401AF5 58 POP EAX ; X
401AF6 8985 08000000 MOV dword ptr[EBP+08h],EAX ; 怨....
_00401AFC 6A FF PUSH FFh ; j.
401AFE 58 POP EAX ; X
401AFF 83F8 00 CMP EAX,+00h ; ・.
401B02 0F84 3C000000 JZ _00401B44 ;if ZF,----->v 00401B44 .・...
401B08 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401B0E 33C9 XOR ECX,ECX ; 3ノ
401B10 81C1 04000000 ADD ECX,00000004h ; ・....
401B16 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401B1C 6A 01 PUSH 01h ; j.
401B1E 5B POP EBX ; [
401B1F 58 POP EAX ; X
401B20 83EC 04 SUB ESP,+04h ; ・.
401B23 2BC3 SUB EAX,EBX ; +テ
401B25 890424 MOV dword ptr[ESP],EAX ; ..$
401B28 5B POP EBX ; [
401B29 58 POP EAX ; X
401B2A 83EC 04 SUB ESP,+04h ; ・.
401B2D B9 FFFFFFFF MOV ECX,FFFFFFFFh ; ケ....
401B32 3BC3 CMP EAX,EBX ; ;テ
401B34 7E 05 JNG _00401B3B ;if ZF || SF!=OF,----->v 00401B3B ~.
401B36 B9 00000000 MOV ECX,00000000h ; ケ....
_00401B3B 890C24 MOV dword ptr[ESP],ECX ; ..$
401B3E 58 POP EAX ; X
401B3F E9 37000000 JMP _00401B7B ;----->v 00401B7B ・...
_00401B44 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401B4A 33C9 XOR ECX,ECX ; 3ノ
401B4C 81C1 04000000 ADD ECX,00000004h ; ・....
401B52 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401B58 6A 01 PUSH 01h ; j.
401B5A 5B POP EBX ; [
401B5B 58 POP EAX ; X
401B5C 83EC 04 SUB ESP,+04h ; ・.
401B5F 2BC3 SUB EAX,EBX ; +テ
401B61 890424 MOV dword ptr[ESP],EAX ; ..$
401B64 5B POP EBX ; [
401B65 58 POP EAX ; X
401B66 83EC 04 SUB ESP,+04h ; ・.
401B69 B9 FFFFFFFF MOV ECX,FFFFFFFFh ; ケ....
401B6E 3BC3 CMP EAX,EBX ; ;テ
401B70 7D 05 JNL _00401B77 ;if SF==OF,----->v 00401B77 }.
401B72 B9 00000000 MOV ECX,00000000h ; ケ....
_00401B77 890C24 MOV dword ptr[ESP],ECX ; ..$
401B7A 58 POP EAX ; X
_00401B7B 83F8 00 CMP EAX,+00h ; ・.
401B7E 0F84 6B000000 JZ _00401BEF ;if ZF,----->v 00401BEF .・...
401B84 33C9 XOR ECX,ECX ; 3ノ
401B86 FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401B8C FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401B92 B8 04000000 MOV EAX,00000004h ; ク....
401B97 50 PUSH EAX ; P
401B98 5B POP EBX ; [
401B99 58 POP EAX ; X
401B9A 83EC 04 SUB ESP,+04h ; ・.
401B9D 0FAFC3 IMUL EAX,EBX ; .ッテ
401BA0 890424 MOV dword ptr[ESP],EAX ; ..$
401BA3 5B POP EBX ; [
401BA4 58 POP EAX ; X
401BA5 83EC 04 SUB ESP,+04h ; ・.
401BA8 03C3 ADD EAX,EBX ; .テ
401BAA 890424 MOV dword ptr[ESP],EAX ; ..$
401BAD 33C9 XOR ECX,ECX ; 3ノ
401BAF FFB1 14704000 PUSH dword ptr[ECX+407014h] ; .ア.p@.
401BB5 FFB5 08000000 PUSH dword ptr[EBP+08h] ; .オ....
401BBB 6A 01 PUSH 01h ; j.
401BBD 5B POP EBX ; [
401BBE 58 POP EAX ; X
401BBF 83EC 04 SUB ESP,+04h ; ・.
401BC2 03C3 ADD EAX,EBX ; .テ
401BC4 890424 MOV dword ptr[ESP],EAX ; ..$
401BC7 B8 04000000 MOV EAX,00000004h ; ク....
401BCC 50 PUSH EAX ; P
401BCD 5B POP EBX ; [
401BCE 58 POP EAX ; X
401BCF 83EC 04 SUB ESP,+04h ; ・.
401BD2 0FAFC3 IMUL EAX,EBX ; .ッテ
401BD5 890424 MOV dword ptr[ESP],EAX ; ..$
401BD8 5B POP EBX ; [
401BD9 58 POP EAX ; X
401BDA 83EC 04 SUB ESP,+04h ; ・.
401BDD 03C3 ADD EAX,EBX ; .テ
401BDF 890424 MOV dword ptr[ESP],EAX ; ..$
401BE2 58 POP EAX ; X
401BE3 8B00 MOV EAX,dword ptr[EAX] ; ..
401BE5 50 PUSH EAX ; P
401BE6 5B POP EBX ; [
401BE7 58 POP EAX ; X
401BE8 8918 MOV dword ptr[EAX],EBX ; ..
401BEA E9 F4FEFFFF JMP _00401AE3 ;----->^ 00401AE3 鴟...
_00401BEF B8 1C704000 MOV EAX,0040701Ch ; ク.p@.
401BF4 50 PUSH EAX ; P
401BF5 FF15 F2514000 CALL dword ptr[4051F2h] ;<==>[4051F2h] ..餔@.
401BFB E9 2C000000 JMP _00401C2C ;----->v 00401C2C ・...
_00401C00 E9 89FDFFFF JMP _0040198E ;----->^ 0040198E 驩...
_00401C05 B8 1C704000 MOV EAX,0040701Ch ; ク.p@.
401C0A 50 PUSH EAX ; P
401C0B FF15 F2514000 CALL dword ptr[4051F2h] ;<==>[4051F2h] ..餔@.
401C11 FFB5 10000000 PUSH dword ptr[EBP+10h] ; .オ....
401C17 58 POP EAX ; X
401C18 83F8 00 CMP EAX,+00h ; ・.
401C1B 0F84 0B000000 JZ _00401C2C ;if ZF,----->v 00401C2C ......
401C21 68 2F604000 PUSH 0040602Fh ; h/`@.
401C26 FF15 D2514000 CALL dword ptr[4051D2h] ;<==>[4051D2h] ..メQ@.
_00401C2C 5F POP EDI ; _
401C2D 5E POP ESI ; ^
401C2E 5B POP EBX ; [
401C2F 8BE5 MOV ESP,EBP ; 句
401C31 5D POP EBP ; ]
401C32 83C4 08 ADD ESP,+08h ; ζ.
401C35 C2 0400 RET 0004h
そういえば、同等のプログラムを書いたら単位処理が重いIf文のほうがクロック数が高くなると思うのですが^^;>>NoWest氏
追記 2006/05/23 21:50
402CE0番地は下請けを含めずに計算すると296クロックでした。また、ここから一度だけ4030AB番地に飛んで、2回401944番地に飛んでいます。ただし401944番地で始まる場所は分岐が多いので最大クロック数と最低クロック数を求めるのに一苦労しそうです。
4030AB番地は下請けを含めずに計算すると338~396クロックです。値が不定なのは掛け算にかかる時間が不定だからです。また、これ以下の下請けはありませんでした。
総クロック数を計算すると、401944番地を計算に含めないなら1360~1534クロックでした。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
ここ以外の場所では「暇人13世」というHNを主として使用。
に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。