tdm gcc 5.1 slower than 4.7

tdm gcc 5.1 slower than 4.7

本文关键字:than slower gcc tdm      更新时间:2023-10-16

我使用tdm gcc编译器来编译我的winapi项目,当我测试一些简单的mandelbrot sse代码(可能与其他项目类似,但我没有测试一切),5.1生成更大的可执行文件330kB对270kB(虽然我没有重新编译的一切,只有热循环模块和链接与已经编译(在4.7)的),也明显较慢的代码23.5毫秒/帧对20毫秒在4.7

这是可怕的…我能用它做什么?(其余的设置等是相同的,我只是重命名编译器文件夹从一个到另一个

我使用类似c的代码,但在c++模式下编译

也许有人知道如何解决它?(我指的是决心让5.1构建至少和4.7一样快,也希望可执行文件更小)

//编辑

ps我做了一个快速测试

因为我可以在51中编译循环模块并在47中链接所有

编译循环47链接47:大小270k速度20毫秒

编译循环51链接51:大小330k速度23.5 ms

编译循环47链接51:大小330k速度20毫秒

编译循环51链接47:大小270k速度23.5 ms

它显示速度下降来自编译在51尺寸膨胀来自链接51

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

  • 代码可以是相同的
  • 但引擎不
c++引擎

  • 负责许多事情,例如:

    1. 内存管理(栈、堆、局部/全局/动态/静态/临时变量)
    2. 模板/类/结构/虚拟管理
    3. 指针管理
    4. 和更多
  • 您可以将其视为操作系统(在某些情况下,它主要是MCU平台上的操作系统)

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

    1. 动态内存分配/释放
    2. 堆/栈贬低

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

  • 如果您正在使用任何类型的lib(如std…)
  • 则新的编译器/链接器可能包含它们的新版本(根据其包含路径)
  • 也会影响性能
  • 如果一些库不能识别新版本的GCC定义
  • 他们可以在
  • 中切换到更慢/更安全的代码

如何将行为设置回旧样式

    如果需要,请使用旧的编译器/链接器。
  • 在较新的版本中,你可以使用旧的引擎(但这可能会导致后来的问题)
  • 查找如下文件:

    crt0.o
    crtfv.o
    libc.a
    
  • 或类似的,用旧版本

  • 替换它们
  • 但不建议这样做…

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

4.7
__Z16mandelbrot_n_sseU8__vectorfS_i: 
    pushl        %ebp 
    movl        %esp, %ebp 
    andl        $-16, %esp 
    subl        $16, %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        $1, %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        $16, %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        $1, %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%的速度