Re: [問題] 關於遞迴加快速度的迷思?

看板C_and_CPP作者 (其其)時間10年前 (2013/09/06 11:02), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串6/10 (看更多)
※ 引述《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
tail call optimize的話你講的這些很多都不用的樣子?
09/06 11:17, 1F

09/06 11:55, , 2F
真的感謝意見!因為我不懂還太多,我會去搜尋相關資料的!
09/06 11:55, 2F

09/06 12:07, , 3F
這邊提到的就是當我們底層使用 call 類指令會有比較大的代價
09/06 12:07, 3F

09/06 12:07, , 4F
tail call 的精神是會把底層的 call 避免掉
09/06 12:07, 4F

09/06 18:53, , 5F
也就是在組語層次看起來你會覺得他是寫了個迴圈
09/06 18:53, 5F
※ 編輯: LittC 來自: 180.176.108.71 (09/07 00:26)
文章代碼(AID): #1IAKN8YY (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 6 之 10 篇):
文章代碼(AID): #1IAKN8YY (C_and_CPP)