[問題] 時間效率問題

看板C_and_CPP (C/C++)作者 (東逼)時間15年前 (2011/01/07 01:52), 編輯推噓5(5016)
留言21則, 9人參與, 最新討論串1/1
我寫了一個簡單的函數 內容是輸入起始月份和結束月份 最後會回傳這幾個月分的總天數 例如說輸入1、3月 最後會回傳31+28+31=90 天 (在此先不考慮閏年、也不考慮結束月份比起始月份小的問題) 以下是我的程式碼: int Totalday(int start_month, int end_month) { int each_month[12] = {31,28,31,30,31,30,31,31,30,31,30,31}; int i, total = 0; for (i = start_month; i<= end_month;i++) { total+=each_month[i]; } return total; } 最後結果是對的 但是我同事說如果考慮到效能問題的話 這樣還是花太多時間了 還說有個寫法可以比這快10倍 (例如原本這程式需要花2秒,有個寫法可以只花0.2秒) 我同事還舉例來說 each_month這個陣列不要定義在function裡 因為每次跑到這個函數時 記憶體就要重新配置一塊區域給這個陣列,所以無形中會花很多時間 最好是定義在外面比較好 (大概是這樣的意思 因為我不是很懂,所以可能轉達有誤 @@) 但是除此之外我就想不到還有啥方法可以更快了 我知道跑迴圈是很花時間的事情 可是這個函數如果不跑迴圈似乎也沒辦法 我自己的想法是可能把這個函數寫成巨集 或是利用 #if 1 ... #end 的方式來處理 查了一下書知道前置處理器的功用是在程式編譯前執行 但不知道他會不會也需要花時間 爬文好像也沒看到類似問題 所以就來請教大家究竟還有沒有其他方法可以縮短這個函數所需要的時間 小弟是剛用 C 工作沒多久的新手 如果問的不好也請大家多多指教包含了 XD 在此就先謝謝大家回覆囉 -- ▍ ▍ ╯╰ ╯╰ ◢◣ ◢◣ 我最愛的 柏柏龍~ 柏柏龍~ ◢██◣ ╮╭ ▎▎╮╭ ▎▎ 柏柏龍~ 柏柏龍~ ⊙ ⊙ ⊙ ⊙ 人人心中都有柏柏龍~ ≡ ▼ ≡ ▲▲ ● ● ≡ ▼ ≡ ■ ■ ■ ■ 憤怒就永遠不會消失~ ⊙⊙ ≡皿 ≡ 炸是最美的擁有~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.167.4.4

01/07 01:59, , 1F
int totalData[]={31,31+28,31+28+31,....}
01/07 01:59, 1F

01/07 01:59, , 2F
用這個例子來說明效能差十倍太誇張.
01/07 01:59, 2F

01/07 02:01, , 3F
等學多一點再來研究精簡或求快速的方法比較好一點,也不
01/07 02:01, 3F

01/07 02:01, , 4F
int m[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
01/07 02:01, 4F

01/07 02:01, , 5F
會太拘泥於一個小地方太久.
01/07 02:01, 5F

01/07 02:01, , 6F
total=totalData[end_month]-totalData[start_mont-1]
01/07 02:01, 6F

01/07 02:03, , 7F
起始a,結束b;for(a→b) all=m[a]+....m[b];大概想法!!
01/07 02:03, 7F

01/07 02:03, , 8F
計算時間日期效能不會差多少吧?之前傻傻寫
01/07 02:03, 8F

01/07 02:03, , 9F
CTime+CDataTime 的東西寫得亂七八糟還是沒覺得慢到哪
01/07 02:03, 9F

01/07 02:10, , 10F
http://codepad.org/FzO5xCt3 我想應該找不到寫得比
01/07 02:10, 10F

01/07 02:11, , 11F
我還要差的版本吧,存天數的陣列的確存累計天數較佳.
01/07 02:11, 11F

01/07 03:23, , 12F
我覺得你同事太小看compiler的加速了
01/07 03:23, 12F

01/07 03:24, , 13F
真的要手動的話, 加一個 static 就好
01/07 03:24, 13F

01/07 04:53, , 14F
stack 變數在 compile 的時候就配置好了吧...
01/07 04:53, 14F

01/07 04:54, , 15F
而且這迴圈跑沒幾次是要怎麼快到十倍
01/07 04:54, 15F

01/07 10:35, , 16F
partial sum + static 就打死一堆人了
01/07 10:35, 16F

01/07 10:36, , 17F
這個例子告訴我們, 有時候無知還是比較好 XD
01/07 10:36, 17F

01/07 11:08, , 18F
http://codepad.org/dplkgrWJ 這樣有沒有快? 你要執行
01/07 11:08, 18F

01/07 11:09, , 19F
期決定區間再用 2維陣列先存起來就好
01/07 11:09, 19F

01/07 14:24, , 20F
你同事這叫做雞蛋裡挑...
01/07 14:24, 20F

01/07 16:17, , 21F
l大這招...
01/07 16:17, 21F
文章代碼(AID): #1D9W5Ijk (C_and_CPP)
文章代碼(AID): #1D9W5Ijk (C_and_CPP)