我正在编译一个Haskell可执行文件,它在启动时从使用serialise包序列化的文件系统中读取大约50 it的数据,然后在继续之前对其应用一些转换。
我想提高可执行文件的启动速度,理论上我可以使用template haskell反序列化这些文件,并将它们编写为data构造函数。但我想知道这是否真的能提高性能?如果代码所花费的大部分时间是调用数据构造函数(也就是说,如果文件IO和反序列化是快速的),那么它就不值得了,而如果调用数据构造函数是快速的,那么它可能是值得的。
此外,GHC对大型数据结构有编译时评估的概念吗?例如,如果我有某种类型的[Foo],在编译时已知并且包含~50 it的数据,那么该可执行文件是否可以在与堆栈相同的haskell中包含预编译的数据,或者是否会像其他所有东西一样懒洋洋地进行计算?
提前感谢您的帮助和建议!
发布于 2022-02-20 13:23:38
我太悲观了。您似乎不太可能在文件I/O上节省时间:如果在编译时反序列化50‘s的内容,则必须将其烘焙到可执行文件中,而且如果序列化格式和GHC格式都是合理有效的编码,则可能会增加大约50’s。因此,将可执行文件加载到内存中的速度会变慢,这大约是您以前在读取数据文件上花费的时间。
同样,GHC将不得不反序列化用于将数据烘焙到可执行文件中的任何格式。如果内存中的数据结构与磁盘上的表示相同,程序就可以避免这种情况,但我无法想象这种情况,因为普通内存中的表示充斥着指针。在这里,GHC的内部格式似乎并不比CBOR便宜得多,因此,如果不读取文件,就会使可执行文件准备得更慢,从而避免任何成本。
https://stackoverflow.com/questions/71194283
复制相似问题