飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 6625|回复: 4

[C/C++] memfind看vc编译器优化

[复制链接]
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

    发表于 2015-6-4 10:08:01 | 显示全部楼层 |阅读模式
    本帖最后由 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[i+j] != str[j])
                                        break;
                        }
                        if (j == sizes)
                                return i;
                }
                return -1;
        };

    我们最优化编译后:

    004014A0  /$  8B4424 0C     mov     eax, dword ptr [esp+0xC]
    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 [esp+0x20]
    004014B2  |.  8B6C24 18     mov     ebp, dword ptr [esp+0x18]
    004014B6  |.  8B4424 14     mov     eax, dword ptr [esp+0x14]
    004014BA  |>  33C9          /xor     ecx, ecx                        ;  主要这里
    004014BC  |.  85F6          |test    esi, esi                        ;  esi并没有改变,但却每次检测
    004014BE  |.  7E 10         |jle     short 004014D0                  ;  到这里

    004014C0  |.  8D1407        |lea     edx, dword ptr [edi+eax]
    004014C3  |>  8A1C0A        |/mov     bl, byte ptr [edx+ecx]
    004014C6  |.  3A1C29        ||cmp     bl, byte ptr [ecx+ebp]
    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 [esp+0x1C]
    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

    QQ五笔截图未命名.png

    004014A0  /$  8B4424 0C     mov     eax, dword ptr [esp+0xC]
    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 [esp+0x20]
    004014B2  |.  8B6C24 18     mov     ebp, dword ptr [esp+0x18]
    004014B6  |.  8B4424 14     mov     eax, dword ptr [esp+0x14]
    004014BA      85F6          /test    esi, esi                        ;  我们修改这里
    004014BC      7E 12         jle     short 004014D0                   ;  
    我们修改这里
    004014BE      33C9          |xor     ecx, ecx                        ;  
    我们修改这里
    004014C0  |.  8D1407        |lea     edx, dword ptr [edi+eax]
    004014C3  |>  8A1C0A        |/mov     bl, byte ptr [edx+ecx]
    004014C6  |.  3A1C29        ||cmp     bl, byte ptr [ecx+ebp]
    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 [esp+0x1C]
    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


    QQ五笔截图未命名1.png


    速度提高将近1/3。所以说编译器不一定可以将你的程序最优化



    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-12-1 11:04
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2015-6-4 10:40:56 | 显示全部楼层
    {:soso_e106:}你这像是默认O2优化。。~~~ 最大选项不是这样子滴

    点评

    o2不是最优化吗?请指教。 /nologo /ML /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /Fo"Release/" /Fd"Release/" /FD /c  详情 回复 发表于 2015-6-4 11:00
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 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

    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 2015-6-4 11:09:25 | 显示全部楼层
    ox优化也是一样的代码!
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-1 23:51
  • 签到天数: 559 天

    [LV.9]以坛为家II

     楼主| 发表于 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 [esp+0x10], eax
    004019E6  |.  85ED          test    ebp, ebp
    004019E8  |.  7E 1E         jle     short 00401A08
    004019EA  |>  33C0          /xor     eax, eax
    004019EC  |.  8D0C1F        |lea     ecx, dword ptr [edi+ebx]
    004019EF  |>  8A1401        |/mov     dl, byte ptr [ecx+eax]
    004019F2  |.  3A5404 18     ||cmp     dl, byte ptr [esp+eax+0x18]
    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

    QQ五笔截图未命名.png
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表