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++ 引擎
负责很多事情,例如:
- 内存管理(栈,堆,local/global/dynamic/static/temp变量)
- template/class/struct/virtual 管理
- 指针管理
- 还有更多
你可以把它看成一个OS(在某些情况下它是一个OS,主要是在MCU平台上)
- 或作为 OS 和您的应用程序
之间的中介
- 所以较新的版本通常会同时处理更多的事情,从而影响性能
- 这可以在文件大小上看到(链接器将引擎添加到您的可执行文件中)
性能主要受到大量使用的影响:
- 动态内存allocation/deallocation
- 类
- 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%
我使用 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++ 引擎
负责很多事情,例如:
- 内存管理(栈,堆,local/global/dynamic/static/temp变量)
- template/class/struct/virtual 管理
- 指针管理
- 还有更多
你可以把它看成一个OS(在某些情况下它是一个OS,主要是在MCU平台上)
- 或作为 OS 和您的应用程序 之间的中介
- 所以较新的版本通常会同时处理更多的事情,从而影响性能
- 这可以在文件大小上看到(链接器将引擎添加到您的可执行文件中)
性能主要受到大量使用的影响:
- 动态内存allocation/deallocation
- 类
- 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%