※ 引述《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