Re: [問題] 如何優化此程式

看板C_and_CPP作者 (i want to be one)時間13年前 (2011/03/01 23:12), 編輯推噓5(508)
留言13則, 8人參與, 最新討論串2/5 (看更多)
※ 引述《truesword ( )》之銘言: : (C語言) : 以下是今天看到一個問題,主要是在問,怎樣優化一個英文大小寫轉換的函數 : 以下是我憑印象打出來的,如有打錯還請多包涵,但功能就是處理字串大寫轉小寫 : 我想到的做法是利用while判斷字串結尾,以省去strlen()的呼叫 : 除此之外,不知道是否有其他想法呢? 對記憶體空間或是執行速度優化都可以 : 程式如下 : //大寫轉小寫 : void tranform(char *s){ : int i=0; : for(i; i<strlen(s); i++){ : if(s[i]>'A' && s[i]<'Z'){ : s[i] -= 'A'-'a'; : } : } : } 簡單看上去有三個地方可改 1. strlen(s)只要做一遍就好了 現在是for-loop每一次跑一次 2. ++i比i++快 3. 'A' - 'a'只要做一遍就好了 const char c = 'A' = 'a'; const int size = strlen(s); for (int i = 0; i < size; ++i) if (s[i] > 'A' && s[i] < 'Z') s[i] -= c; 有沒有更快 有 當然是建表 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 123.193.87.144

03/01 23:18, , 1F
這三個地方,compile的最佳化可以應付嗎?(對這領域不熟)
03/01 23:18, 1F

03/01 23:26, , 2F
primer 提到,i++ 要多一個暫存器,時間差在這.
03/01 23:26, 2F

03/01 23:26, , 3F
compiler 應該無法確定在 for body 內有沒有改過 s 長度
03/01 23:26, 3F

03/01 23:27, , 4F
所以最佳化應該不敢動這部份吧,猜測
03/01 23:27, 4F

03/01 23:28, , 5F
其實2跟3 compiler 都消的掉
03/01 23:28, 5F

03/01 23:29, , 6F
改成 void tranform(const char * const s) 的話能消1嗎?
03/01 23:29, 6F

03/01 23:35, , 7F
gcc 不會, 但有看過一些會針對標準函數特化的paper
03/01 23:35, 7F

03/01 23:56, , 8F
for (int i = 0; s[i] != '\0'; i++) 就好了, strlen 一
03/01 23:56, 8F

03/01 23:57, , 9F
次都不用
03/01 23:57, 9F

03/02 00:50, , 10F
i++ 在這種用途通常都會跟 ++i 一模一樣
03/02 00:50, 10F

03/02 14:19, , 11F
++i 比 i++ 快 !? 真假 @@!!
03/02 14:19, 11F

03/02 14:39, , 12F
如果compiler沒有優化過,那++i是快了一點沒錯
03/02 14:39, 12F

03/02 14:40, , 13F
可以通常都會被優化掉,而且這個速度差距也很小很小
03/02 14:40, 13F
文章代碼(AID): #1DRGpba- (C_and_CPP)
文章代碼(AID): #1DRGpba- (C_and_CPP)