精華區beta Programming 關於我們 聯絡資訊
※ 引述《leicheong.bbs@bbs.sayya.org (理昌)》之銘言: : 補上全域最佳化下的結果: : 不論在#define或const宣告, 都只剩下這一句: : 00401000 /$ 6A 0A PUSH 0A 由此可以看出在最佳化後兩者並沒有差異, 你之前列出的差別是在沒有最佳化, 甚至是可能是用 -g 的情形. 並不能以沒有最佳化的情況來下 const 會有較多的 cache miss 或會有較慢的執行速度. 應以最佳化後的組語來比較, 兩者並無 差異. : > 這個例子並不是針對 const 做最佳化的情形, 而是在 compiler time : > 時無法算出 const 或 #define 值的情形. 只要在 compiler time 不能 : > 解析,使用 const 就會比較佳. : 在上文中已經證實, 你在前文中舉的這個例子並沒有為使用const : 的執碼碼帶來任何速度上的優勢. 我前文的例子是在 compile time 時可以解析出 const 或 #define 值的情形, 在這種情況下, 我之前提過兩者沒有差異, 你後來也在比較最佳化的組語後證實 了這一點. 這部份討論的是 "在 compile time 無法解析 const 或 #define 值" 的情形, 你已經第二次忽略這一點, 而一直拿去 "可解析" 的情況比較. 在 "不能解析出 值" 的情形, 使用 #define 的話, 在每一個用到的地方都會被展開, 如在這個例子 中, 被展成 (A+B), 而不能用一個常數來代替, 因此, 在每一個用到 D 的地方, 都要重新再算一次 (A+B), 不但加大 code print, 增加 i-cache miss, 也因為 每次都要重算, 而降低執行效率. 你可以試著對 "compile time 無法解析出值" 的情形產生組語來比較, 就算是用 最佳化, 也無法在個 case 讓 #define 產生和 const 一樣有效率的組語. (不要 再和 "compile time 可解析出值" 的情形來比就好) : > 這裡是回應你之前提的使用 const 會比用 #define 增加 cache miss 及會 : > 造成執行效率低的情形, 指出這個說法是不正確的. : 在昨天貼的文已經證明, 用const在pass parameter時產生的執行碼 : 長度, 比用#define長許多(我也不知道為什麼). 現在知道是你沒有最佳化的原因, 在最佳化後兩者相同, 所以你之前的關於使用 const 會增加 cache miss 及降低執行速度是不正確. : > 那你有沒有想過現在 compiler 競爭這麼激烈, 如果使用 #define 能像你 : > 所說的提高執行效率, 為什麼大部份的 compiler 都不去做這麼簡單的改變 : > 來得到好處呢? : 這是一條沒有意義的問題, 因為大部份的compiler的output都不支援 : 這種變換. : 因為這種變換只在JIT類的執行方式才有意義, 而另一支援JIT的 : 語言(Java)不支援#define preprocessor directive. : 你有興趣的話倒可以找一下mono的執行檔有沒有做這種變換... 那你光提少數一個 compiler 更是沒有意義, 而且你已經證實在最佳化後, 使用 const 不會比 #define 慢, 所以執行效率根本不是你提的 compiler 把 const 改成 #define 的原因. 要不要把 const 改成 #define 和 output 沒有關係, compiler 的 output 是 組語, 在組語中使用常數並不會有問題, 你認為不行是因為 JIT 把 compiler 的工作拆成兩部份, 你只看前半段當然不夠, 因為整個 compiler 的工作尚未完成. 要以傳統的 compiler 來出發, 要比也要比最後產生的 code (例如 java vm 的 結果), 而非在 JIT 的中間碼. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 69.236.127.197