使用模板haskell反序列化数据类型时的性能改进



我正在编译一个Haskell可执行文件,该可执行文件在启动时从使用serialise包序列化的文件系统中读取大约50MB的数据,然后在继续之前对其应用一些转换。

我想提高可执行文件的启动速度,理论上我可以使用template haskell来反序列化文件,并将它们写成data构造函数。但我想知道这是否真的能提高性能?如果代码花费的大部分时间是调用数据构造函数(意味着如果文件IO和反序列化很快(,那么这是不值得的,而如果调用数据构造函数很快,那么这可能是值得的。

此外,GHC对大型数据结构的编译时评估有任何概念吗。也就是说,如果我有一个类型为[Foo]的东西,它在编译时是已知的,并且包含大约50MB的数据,那么有没有任何方法可以让可执行文件包含预编译的数据,无论它是在堆栈的haskell等价物中,或者它会像其他东西一样被惰性地评估?

提前感谢您的帮助&劝告

我很悲观。你似乎不太可能在文件I/O上节省时间:如果你在编译时反序列化50MB的东西,你必须将其烘焙到可执行文件中,假设序列化格式和GHC的格式都是相当有效的编码,它可能会大50MB。因此,将可执行文件加载到内存中的速度会变慢,大约相当于您以前读取数据文件所花费的时间。

同样,GHC将不得不反序列化它用来将数据烘焙到可执行文件中的任何格式。如果内存中的数据结构与磁盘上的表示形式相同,程序可以避免这种情况,但我无法想象会是这样,因为正常的内存中表示形式充斥着指针。在这里,GHC的内部格式反序列化似乎并不比CBOR便宜多少,所以你不读取文件所避免的任何成本,都会使可执行文件的准备速度变慢。

相关内容

  • 没有找到相关文章

最新更新