2011-12-07 65 views
2

我有下面的代碼片段:爲什麼常數迴歸更快?

import Network.MessagePackRpc.Server 

ping :: String -> IO String 
ping s = return s 

main :: IO() 
main = do 
    serve 8081 [ ("add", fun add), ("ping", fun ping) ] 

現在,我看到的是,當我發送帶有例如一個字符串100000個相同的1024字節字符串,小片段大約運行2秒。如果我去,用例如return "the-1024-byte-string",那麼運行速度大約快25%。我已經上下運動了。我真的很驚訝,這個影響如此巨大。有沒有人有解釋?

+1

我猜懶惰在這裏做點事情。你是否嘗試過'ping!s = return return「-'-1024-byte-string」'? – fuz

+3

你用'-O2'編譯了嗎?如果沒有用'-O2'和'-fllvm'編譯的第一次測試,現在有一條規則是不允許你在SO上提出性能問題。 –

+1

@ ThomasM.DuBuisson Gevalt!我沒有llvm。 (幸運的是,我目前沒有任何性能問題。) –

回答

3

返回一個已知的(在編譯時)常量可以啓用更多的內聯。但是,必須檢查生成的代碼才能確定。