看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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
james732:這三個地方,compile的最佳化可以應付嗎?(對這領域不熟) 03/01 23:18
tropical72:primer 提到,i++ 要多一個暫存器,時間差在這. 03/01 23:26
purpose:compiler 應該無法確定在 for body 內有沒有改過 s 長度 03/01 23:26
purpose:所以最佳化應該不敢動這部份吧,猜測 03/01 23:27
akasan:其實2跟3 compiler 都消的掉 03/01 23:28
james732:改成 void tranform(const char * const s) 的話能消1嗎? 03/01 23:29
akasan:gcc 不會, 但有看過一些會針對標準函數特化的paper 03/01 23:35
uranusjr:for (int i = 0; s[i] != '\0'; i++) 就好了, strlen 一 03/01 23:56
uranusjr:次都不用 03/01 23:57
Ebergies:i++ 在這種用途通常都會跟 ++i 一模一樣 03/02 00:50
abzxcx:++i 比 i++ 快 !? 真假 @@!! 03/02 14:19
chchwy:如果compiler沒有優化過,那++i是快了一點沒錯 03/02 14:39
chchwy:可以通常都會被優化掉,而且這個速度差距也很小很小 03/02 14:40