memfind看vc编译器优化
本帖最后由 menglv 于 2015-6-4 10:09 编辑int memfind(char *mem, char *str, int sizem, int sizes)
{
int i=0,j=0;
for (; i < sizem;i++)
{
for (j = 0; j < sizes; j++)
{
if (mem != str)
break;
}
if (j == sizes)
return i;
}
return -1;
};
我们最优化编译后:
004014A0/$8B4424 0C mov eax, dword ptr
004014A4|.53 push ebx
004014A5|.55 push ebp
004014A6|.56 push esi
004014A7|.57 push edi
004014A8|.33FF xor edi, edi
004014AA|.85C0 test eax, eax
004014AC|.7E 2F jle short 004014DD
004014AE|.8B7424 20 mov esi, dword ptr
004014B2|.8B6C24 18 mov ebp, dword ptr
004014B6|.8B4424 14 mov eax, dword ptr
004014BA|>33C9 /xor ecx, ecx ;主要这里
004014BC|.85F6 |test esi, esi ;esi并没有改变,但却每次检测
004014BE|.7E 10 |jle short 004014D0 ;到这里
004014C0|.8D1407 |lea edx, dword ptr
004014C3|>8A1C0A |/mov bl, byte ptr
004014C6|.3A1C29 ||cmp bl, byte ptr
004014C9|.75 05 ||jnz short 004014D0
004014CB|.41 ||inc ecx
004014CC|.3BCE ||cmp ecx, esi
004014CE|.^ 7C F3 |\jl short 004014C3
004014D0|>3BCE |cmp ecx, esi
004014D2|.74 11 |je short 004014E5
004014D4|.8B4C24 1C |mov ecx, dword ptr
004014D8|.47 |inc edi
004014D9|.3BF9 |cmp edi, ecx
004014DB|.^ 7C DD \jl short 004014BA
004014DD|>5F pop edi
004014DE|.5E pop esi
004014DF|.5D pop ebp
004014E0|.83C8 FF or eax, 0xFFFFFFFF
004014E3|.5B pop ebx
004014E4|.C3 retn
004014E5|>8BC7 mov eax, edi
004014E7|.5F pop edi
004014E8|.5E pop esi
004014E9|.5D pop ebp
004014EA|.5B pop ebx
004014EB\.C3 retn
004014A0/$8B4424 0C mov eax, dword ptr
004014A4|.53 push ebx
004014A5|.55 push ebp
004014A6|.56 push esi
004014A7|.57 push edi
004014A8|.33FF xor edi, edi
004014AA|.85C0 test eax, eax
004014AC|.7E 2F jle short 004014DD
004014AE|.8B7424 20 mov esi, dword ptr
004014B2|.8B6C24 18 mov ebp, dword ptr
004014B6|.8B4424 14 mov eax, dword ptr
004014BA 85F6 /test esi, esi ;我们修改这里
004014BC 7E 12 jle short 004014D0 ;我们修改这里
004014BE 33C9 |xor ecx, ecx ;我们修改这里
004014C0|.8D1407 |lea edx, dword ptr
004014C3|>8A1C0A |/mov bl, byte ptr
004014C6|.3A1C29 ||cmp bl, byte ptr
004014C9|.75 05 ||jnz short 004014D0
004014CB|.41 ||inc ecx
004014CC|.3BCE ||cmp ecx, esi
004014CE|.^ 7C F3 |\jl short 004014C3
004014D0|>3BCE |cmp ecx, esi
004014D2|.74 11 |je short 004014E5
004014D4|.8B4C24 1C |mov ecx, dword ptr
004014D8|.47 |inc edi
004014D9|.3BF9 |cmp edi, ecx
004014DB ^\7C E1 jl short 004014BE ;我们修改这里
004014DD|>5F pop edi
004014DE|.5E pop esi
004014DF|.5D pop ebp
004014E0|.83C8 FF or eax, 0xFFFFFFFF
004014E3|.5B pop ebx
004014E4|.C3 retn
004014E5|>8BC7 mov eax, edi
004014E7|.5F pop edi
004014E8|.5E pop esi
004014E9|.5D pop ebp
004014EA|.5B pop ebx
004014EB\.C3 retn
速度提高将近1/3。所以说编译器不一定可以将你的程序最优化。
{:soso_e106:}你这像是默认O2优化。。~~~ 最大选项不是这样子滴 飘云 发表于 2015-6-4 10:40
你这像是默认O2优化。。~~~ 最大选项不是这样子滴
o2不是最优化吗?请指教。
/nologo /ML /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"Release/" /Fd"Release/" /FD /c
ox优化也是一样的代码! 最大化优化后确实有效果,只是那个memfind函数直接放在外面调用了。这样代码就不是那么容易看懂了。
/nologo /ML /W3 /Ox /Ot /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"Release/" /Fd"Release/" /FD /Ogityb2 /Gs /c
004019E0|.33FF xor edi, edi
004019E2|.894424 10 mov dword ptr , eax
004019E6|.85ED test ebp, ebp
004019E8|.7E 1E jle short 00401A08
004019EA|>33C0 /xor eax, eax
004019EC|.8D0C1F |lea ecx, dword ptr
004019EF|>8A1401 |/mov dl, byte ptr
004019F2|.3A5404 18 ||cmp dl, byte ptr
004019F6|.75 06 ||jnz short 004019FE
004019F8|.40 ||inc eax
004019F9|.83F8 10 ||cmp eax, 0x10
004019FC|.^ 7C F1 |\jl short 004019EF
004019FE|>83F8 10 |cmp eax, 0x10
00401A01|.74 08 |je short 00401A0B
00401A03|.47 |inc edi
00401A04|.3BFD |cmp edi, ebp
00401A06|.^ 7C E2 \jl short 004019EA
00401A08|>83CF FF or edi, 0xFFFFFFFF
00401A0B|>57 push edi
页:
[1]