tdm gcc 5.1 slower than 4.7
tdm gcc 5.1 slower than 4.7
我使用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++引擎
- 代码可以是相同的
- 但引擎不
负责许多事情,例如:
- 内存管理(栈、堆、局部/全局/动态/静态/临时变量)
- 模板/类/结构/虚拟管理
- 指针管理
- 和更多
您可以将其视为操作系统(在某些情况下,它主要是MCU平台上的操作系统)
- 或作为操作系统和应用程序 之间的中介
- 所以新版本通常会同时处理更多影响性能的事情
- 这可以在文件大小上看到(链接器将引擎添加到可执行文件中)
和性能主要受影响的是大量使用:
- 动态内存分配/释放
- 堆/栈贬低
另一个可能的原因是链接库的版本
- 如果您正在使用任何类型的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%的速度
相关文章:
- D-lang being faster than C++?
- MATLAB faster than LAPACK?
- "How to use long long data-type rather than pointers data-type to modify other variables ?"
- 如何实现随机访问迭代器的"less than operator"?
- 如何在 C++ 类中重载 'less than' 运算符以比较常量?
- 为什么我收到错误:"there is more than one default constructor"?
- std::tuple faster than std::array?
- 有没有办法通过'greater/lesser than'而不是"="来定义'int'?
- "compares less than 0"是什么意思?
- OpenSSL 错误"data greater than mod len"
- 特征:如何将"greater than"的结果(在ArrayXf上)转换为特征向量
- Is calloc better than malloc?
- glDeleteBuffers slower than glBufferData
- ADO GetRows Slower Than GetFields and MoveNext
- CL_MEM_ALLOC_HOST_PTR slower than CL_MEM_USE_HOST_PTR
- SSE slower than FPU?
- std::lower_bound slower for std::vector than std::map::find
- QuickSort is slower than std::sort
- tdm gcc 5.1 slower than 4.7
- mmap slower than getline?