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

作者: jimfan (jimfan)   2017-09-15 13:09:24
: 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 專科,如有錯漏請賜教
作者: jimfan (jimfan)   2017-09-15 13:12:00
更正:如果 movl、addl 對於 1(0x1)、100000(0x186A0)所需 clock cycle不一樣 <<<又另當別論
作者: hsiansheng (SHENG)   2017-09-15 13:30:00
感謝J大,我對組語完全沒概念,需要先研究一下才行QQ
作者: jimfan (jimfan)   2017-09-15 13:35:00
有興趣就成事了,加油
作者: enonrick (EnonRick)   2017-09-15 15:28:00
用loop測只是在測哪一段撞到中斷的次數多而以,沒意義

Links booklink

Contact Us: admin [ a t ] ucptt.com