menglv 发表于 2015-6-4 10:08:01

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。所以说编译器不一定可以将你的程序最优化。



飘云 发表于 2015-6-4 10:40:56

{:soso_e106:}你这像是默认O2优化。。~~~ 最大选项不是这样子滴

menglv 发表于 2015-6-4 11:00:37

飘云 发表于 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

menglv 发表于 2015-6-4 11:09:25

ox优化也是一样的代码!

menglv 发表于 2015-6-4 15:00:25

最大化优化后确实有效果,只是那个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]
查看完整版本: memfind看vc编译器优化