Re: [問題] 相同型態的變數但值不同,運算量的差異?

看板C_and_CPP (C/C++)作者 (jimfan)時間8年前 (2017/09/15 13:09), 編輯推噓1(106)
留言7則, 3人參與, 最新討論串2/2 (看更多)
: C : 問題(Question): : int a = 0, b = 0, c = 0; : case 1: : a = 1, b = 1; : c = a + b; : case 2: : a = 100000, b = 100000; : c = a + b; : 宣告的變數型態相同,但值閾不同, : 上述兩個case分別的運算量會有差異嗎? 類似疑問你可以用編譯器將 .c 編譯為組合語言看看 以我用 gcc 為例: gcc -S int.c 輸出檔案 int.s,看看 int.c 為 case 1 的內容: call ___main movl $0, 12(%esp) # a = 0 movl $0, 8(%esp) # b = 0 movl $0, 4(%esp) # c = 0 movl $1, 12(%esp) # a = 1 movl $1, 8(%esp) # b = 1 movl 12(%esp), %edx # c = a + b movl 8(%esp), %eax addl %edx, %eax movl %eax, 4(%esp) movl $0, %eax # return 0 leave 又看看 int.c 為 case 2 時的內容: call ___main movl $0, 12(%esp) # a = 0 movl $0, 8(%esp) # b = 0 movl $0, 4(%esp) # c = 0 movl $100000, 12(%esp) # a = 1 movl $100000, 8(%esp) # b = 1 movl 12(%esp), %edx # c = a + b movl 8(%esp), %eax addl %edx, %eax movl %eax, 4(%esp) movl $0, %eax # return 0 leave 所用的 CPU 指令一模一樣,大抵可以假設 CPU 運算需要的 clock cycle是一樣的 當然,如果 movl、addl 對於 1(0x1)、100000(0x186A0)又另當別論,至少 Intel 不會對此有特別說明,你可以行 for loop 10000000(或更多)次試試。 另外,用不同編譯器也許(多數)會導致不同輸出,有些編譯器可能不用 stack 而用 暫存器放置 a、b、c 的值,如果行 for loop 或更複雜的運算效能可能有所不同。 又另外,硬體都會導致差異。如果你用 16-bit CPU 的話... 最後,有樓主提到 optimisation,在 gcc 下如果加上 -O3 的輸出變成: _main: LFB0: .cfi_startproc pushl %ebp .cfi_def_cfa_offset 8 .cfi_offset 5, -8 movl %esp, %ebp .cfi_def_cfa_register 5 andl $-16, %esp call ___main xorl %eax, %eax leave 所有 a、b、c 的運算省略了,因編譯器知道他們的值根本沒有牽涉輸出輸入,main() 基本上直接 return。 在下也非 CS 專科,如有錯漏請賜教 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 14.199.97.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1505452167.A.E0E.html

09/15 13:12, , 1F
更正:
09/15 13:12, 1F

09/15 13:13, , 2F
如果 movl、addl 對於 1(0x1)、100000(0x186A0)
09/15 13:13, 2F

09/15 13:13, , 3F
所需 clock cycle不一樣 <<<
09/15 13:13, 3F

09/15 13:14, , 4F
又另當別論
09/15 13:14, 4F

09/15 13:30, , 5F
感謝J大,我對組語完全沒概念,需要先研究一下才行QQ
09/15 13:30, 5F

09/15 13:35, , 6F
有興趣就成事了,加油
09/15 13:35, 6F

09/15 15:28, , 7F
用loop測只是在測哪一段撞到中斷的次數多而以,沒意義
09/15 15:28, 7F
文章代碼(AID): #1Pks27uE (C_and_CPP)
文章代碼(AID): #1Pks27uE (C_and_CPP)