Re: [問題] 關於遞迴加快速度的迷思?
※ 引述《crazycat2 (浪無定所)》之銘言:
: 開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
: C
: 問題(Question):
: 因為最近在撰寫遞迴,發現執行的時間過於冗長。
: 上網:項次越高的話,使用迴圈能大幅提高效能。
: 但因使用方式,還是以遞迴為主。
: 不經好奇若將遞迴改成static或是marco會更快嗎?
函數在匯編(組語)中是這樣: 假設為x86 32位
進函數:
PUSH EBP;
MOV EBP ESP;
/*
PUSH 要用的寄存器,可略
*/
出函數:
MOV EAX, [EBP - XXX]; /*回傳值放在EAX上傳遞,
若是void型態的函數就沒這行*/
/*
POP 用到的寄存器,可略
*/
MOV ESP, EBP;
POP EBP;
RET XXX (看是cdecl 還是stdcall,cdecl XXX就不用寫了 ,
stdcall就是引數空間大小)
開棧(區域變量):
SUB ESP, SIZEOF(TOTAL VARIABLES);
消滅棧:
ADD ESP, SIZEOF(TOTAL VARIABLES);
調用函數:
幾個變量這動作就做幾次,從最後一個變量開始推
MOV EAX, [EBP - XXX];/*[EBP - XXX] 是某個區域變量*/
PUSH EAX;
最後再 call XXFunc;
調用完函數:
stdcall不用作,
cdecl 就要 ADD ESP, SIZEOF(TOTAL ARGUMENT VARIABLES);
這些動作都是要時間的喔
一個指令一個時脈,沒錯,是很快,但遞迴下去還是很可怕
雖然編譯器可以優化掉一些工作
好比 PUSH EBP與POP EBP就不要了 直接用ESP當棧基準
但還是很多動作不能精簡
所以呢,能不用遞迴就不要用遞迴
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.176.108.71
※ 編輯: LittC 來自: 180.176.108.71 (09/06 11:04)
※ 編輯: LittC 來自: 180.176.108.71 (09/06 11:08)
→
09/06 11:17, , 1F
09/06 11:17, 1F
推
09/06 11:55, , 2F
09/06 11:55, 2F
→
09/06 12:07, , 3F
09/06 12:07, 3F
→
09/06 12:07, , 4F
09/06 12:07, 4F
→
09/06 18:53, , 5F
09/06 18:53, 5F
※ 編輯: LittC 來自: 180.176.108.71 (09/07 00:26)
討論串 (同標題文章)