我正在編譯一個 Haskell 可執行檔案,它在啟動時會從已使用serialise包序列化的檔案系統中讀取大約 50MB 的資料,然后在繼續之前對其進行一些轉換。
我想提高可執行檔案的啟動速度,理論上我可以使用模板haskell來反序列化檔案并將它們寫成data建構式。但我想知道這是否真的會提高性能?如果代碼花費的大部分時間是呼叫資料建構式(意味著如果檔案 IO 和反序列化速度很快),那么它不值得,而如果呼叫資料建構式很快,那么它可能是值得的。
此外,GHC 是否有任何大型資料結構的編譯時評估的概念。即,如果我有某種型別的東西[Foo]在編譯時已知并且包含約 50MB 的資料,那么可執行檔案是否可以包含在任何與堆疊等效的 haskell 中預編譯的內容,或者它會像其他所有內容一樣被懶惰地評估?
提前感謝您的幫助和建議!
uj5u.com熱心網友回復:
我很悲觀。您似乎不太可能在檔案 I/O 上節省時間:如果您在編譯時反序列化 50MB 的內容,則必須將其烘焙到可執行檔案中,假設序列化格式和 GHC 的格式為兩種合理有效的編碼。因此,將可執行檔案加載到記憶體中會變慢,大約是您之前花費在讀取資料檔案上的時間。
同樣,GHC 必須反序列化用于將資料烘焙到可執行檔案中的任何格式。如果記憶體中的資料結構與磁盤上的表示相同,則程式可以避免這種情況,但我無法想象會出現這種情況,因為正常的記憶體中表示充滿了指標。同樣,GHC 的內部格式反序列化似乎并不比 CBOR 便宜多少,因此您通過不讀取檔案而避免的任何成本,都會因使可執行檔案的準備速度變慢而產生。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431381.html
標籤:哈斯克尔
上一篇:haskell中的同類產品
