tdm gcc 5.1 比 4.7 慢

tdm gcc 5.1 slower than 4.7

我使用 tdm gcc 编译器编译我的 winapi 项目,当我测试一些简单的 mandelbrot sse 代码 9 时可能与其他项目一样,但我没有测试所有东西),5.1 生成更大的可执行文件 330kB 而不是 270kB(虽然我没有重新编译了所有东西,只有热循环模块和 link 与已经编译的(在 4.7 中)一起编辑)并且还注意到较慢的代码 23.5 ms /frame agianst 20 ms in 4.7

太可怕了..我能用它做什么? (其余设置等相同,我只是将编译器文件夹从一个重命名为另一个

我使用类 C 代码,但在 C++ 模式下编译

有人知道怎么解决吗? (我的意思是决心 使 5.1 构建至少与 4.7 一样快,也希望可执行文件更小)

//编辑

ps我做了快速测试

因为我可能会在 51 中编译循环模块,link 全部在 47 中编译

编译循环 47 link 47:大小 270k 速度 20 ms

编译循环 51 link 51:大小 330k 速度 23.5 毫秒

编译循环 47 link 51:大小 330k 速度 20 ms

编译循环 51 link 47:大小 270k 速度 23.5 毫秒

说明速度下降是51编译的 尺寸膨胀来自 link 51

不同的C++编译器版本使用不同的C++引擎

  • 代码可能相同
  • 但引擎没有

C++ 引擎

  • 负责很多事情,例如:

    1. 内存管理(栈,堆,local/global/dynamic/static/temp变量)
    2. template/class/struct/virtual 管理
    3. 指针管理
    4. 还有更多
  • 你可以把它看成一个OS(在某些情况下它是一个OS,主要是在MCU平台上)

  • 或作为 OS 和您的应用程序
  • 之间的中介
  • 所以较新的版本通常会同时处理更多的事情,从而影响性能
  • 这可以在文件大小上看到(链接器将引擎添加到您的可执行文件中)
  • 性能主要受到大量使用的影响:

    1. 动态内存allocation/deallocation
    2. heap/stack 垃圾处理

另一个可能的原因是链接库的版本

  • 如果您正在使用任何类型的库(如 std ...)
  • 然后较新的 compiler/linker 可能包含它们的较新版本(根据其包含路径)
  • 这也会影响性能
  • 如果某些库无法识别更新版本的 GCC 定义
  • 他们可以切换到 slower/safer 里面的代码

如何将行为设置回旧样式

  • 如果需要,请使用较旧的 compiler/linker
  • 在较新的版本中,您可以使用较旧的引擎(但这可能会导致以后出现问题)
  • 查找如下文件:

    crt0.o
    crtfv.o
    libc.a
    
  • 或类似的并用旧版本替换它们

  • 但不建议这样做...

我检查了程序集,它显示了生成代码的一些变化, 虽然轻微

4.7

__Z16mandelbrot_n_sseU8__vectorfS_i: 
    pushl        %ebp 
    movl        %esp, %ebp 
    andl        $-16, %esp 
    subl        , %esp 
    movl        8(%ebp), %ecx 
    movaps        %xmm0, (%esp) 
    testl        %ecx, %ecx 
    js        L12 
    xorps        %xmm0, %xmm0 
    xorl        %eax, %eax 
    movaps        %xmm0, %xmm2 
    movaps        %xmm0, %xmm4 
    jmp        L11 
    .p2align 4,,7 
L19: 
    mulps        %xmm4, %xmm2 
    addl        , %eax 
    subps        %xmm5, %xmm6 
    movaps        (%esp), %xmm4 
    cmpl        %eax, %ecx 
    addps        %xmm6, %xmm4 
    addps        %xmm2, %xmm2 
    addps        %xmm1, %xmm2 
    jl        L10 
L11: 
    movaps        %xmm4, %xmm6 
    movaps        %xmm2, %xmm5 
    movaps        LC5, %xmm7 
    mulps        %xmm4, %xmm6 
    mulps        %xmm2, %xmm5 
    movaps        %xmm6, %xmm3 
    addps        %xmm5, %xmm3 
    cmpltps        LC4, %xmm3 
    andps        %xmm3, %xmm7 
    movmskps        %xmm3, %edx 
    testl        %edx, %edx 
    addps        %xmm7, %xmm0 
    jne        L19 
L10: 
    cvtps2dq        %xmm0, %xmm0 
    leave 
    ret 
L12: 
    xorps        %xmm0, %xmm0 
    jmp        L10 
    .globl        __Z16mandelbrot_n_sseDv4_fS_i 

5.1

__Z16mandelbrot_n_sseDv4_fS_i: 
    pushl        %ebp 
    movl        %esp, %ebp 
    andl        $-16, %esp 
    subl        , %esp 
    movl        8(%ebp), %ecx 
    movaps        %xmm0, (%esp) 
    testl        %ecx, %ecx 
    js        L11 
    pxor        %xmm0, %xmm0 
    xorl        %edx, %edx 
    movaps        %xmm0, %xmm5 
    movaps        %xmm0, %xmm2 
    jmp        L10 
    .p2align 4,,10 
L18: 
    mulps        %xmm2, %xmm5 
    addl        , %edx 
    subps        %xmm6, %xmm4 
    cmpl        %edx, %ecx 
    addps        %xmm5, %xmm5 
    addps        (%esp), %xmm4 
    addps        %xmm1, %xmm5 
    jl        L9 
    movaps        %xmm4, %xmm2 
L10: 
    movaps        %xmm2, %xmm4 
    movaps        %xmm5, %xmm6 
    movaps        LC7, %xmm7 
    mulps        %xmm2, %xmm4 
    mulps        %xmm5, %xmm6 
    movaps        %xmm4, %xmm3 
    addps        %xmm6, %xmm3 
    cmpltps        LC6, %xmm3 
    andps        %xmm3, %xmm7 
    movmskps        %xmm3, %eax 
    testl        %eax, %eax 
    addps        %xmm7, %xmm0 
    jne        L18 
L9: 
    cvtps2dq        %xmm0, %xmm0 
    leave 
    ret 
L11: 
    pxor        %xmm0, %xmm0 
    jmp        L9 
    .section        .text.unlikely,"x" 
LCOLDE8: 
    .text 

看来5.1版本不吉利,降速15%