2015-08-26 74 views
2

我使用tdm gcc編譯器來編譯我的winapi項目,當我測試一些簡單的mandelbrot sse代碼9可能與其他項目相似,但我沒有測試過任何東西),5.1生成較大的可執行文件330kB對270kB (雖然我沒有重新編譯所有的東西,只有熱循環模塊和鏈接已編譯(在4.7)之一),也通過較慢的代碼23.5 ms /幀agianst 20毫秒4.7tdm gcc 5.1慢於4.7

這是可怕的..我能做什麼它? (設置等,其餘是一樣的,我只從一個重命名編譯器文件夾anither使用類似C的代碼

林但在C++編譯模式

是否也許有人知道如何解決它?(通過以下方法解決我的意思是 使5.1構建工作速度至少爲4.7,也寧願可執行文件更小)

//編輯

PS我還做快速測試

我可以編譯迴路模塊51和鏈接都在47

編譯環47連桿47:大小270K速度20毫秒

編譯環51連桿51:大小330K速度23.5毫秒

編譯環47連桿51:大小330K速度20毫秒

編譯循環51鏈接47:大小270k速度23。5毫秒

它表明速度的下降來自在51 通過編譯和尺寸膨脹來自鏈路51

+0

也許你忘了指定優化級別? – Creris

+0

沒有它完全相同的兩個(-O2) – user2214913

回答

0

我檢查了裝配,它體現在生成的代碼 雖然略有

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版本是不吉利的一個,它CST一些變化, 15%減速

0

不同C++編譯器的版本使用不同的C++發動機

  • 代碼可以是相同的
  • 但發動機不

C++發動機

  • 負責很多事情一樣:

    1. 內存管理(棧,堆,局部/全局/動態/靜態/臨時變量)
    2. 模板/類/結構/虛擬管理
    3. 指針管理
    4. 以及更多
  • 你可以把它看成一個OS(在某些情況下,它主要是在MCU平臺的OS)

  • OS和應用程序之間調停
  • 所以新版本往往處理更多的事情在一次影響性能
  • 這可以在文件大小可以看出(連接器添加引擎到您的可執行文件)
  • 和性能與大量使用的主要影響:

    1. 動態存儲器分配/釋放
    2. 堆/堆棧搗毀

另一個可能的原因可以是鏈接庫

  • 的版本,如果使用的是任何類型的lib(比如std ...)
  • 然後更新的編譯器/鏈接器可以包括(按照其包括路徑)
  • 這也可能會影響性能
  • 也如果GCC限定
  • 它們可以切換一些庫無法識別新版本他們的較新版本較慢的/更安全的代碼裏面

如何設置的行爲回到舊式

  • 使用舊的編譯器/連接,如果你在新版本中,你可以使用舊引擎(但可能導致問題的後者)
  • 外觀像文件需要

  • crt0.o 
    crtfv.o 
    libc.a 
    
  • 或相似並用舊版本替換它們

  • 但是不建議這麼做...
+0

GCC 5不使用從4.7 –

+0

@JonathanWakely不同的「引擎」在這種情況下,我的線索少... – Spektre