使用 template-haskell 反序列化数据类型时的性能改进
Performance improvements when using template-haskell to deserialize a data type
我正在编译一个 Haskell 可执行文件,它在启动时从使用 serialise
包序列化的文件系统中读取大约 50MB 的数据,然后在之前对其应用一些转换继续。
我想提高可执行文件的启动速度,理论上我可以使用模板haskell反序列化文件并将它们写成data
构造函数。但我想知道这是否真的会提高性能?如果代码花费的大部分时间是调用数据构造函数(意味着如果文件 IO 和反序列化很快)那么它就不值得,而如果调用数据构造函数很快那么它可能是值得的。
此外,GHC 是否有大型数据结构的编译时评估概念。也就是说,如果我有一些在编译时已知的 [Foo]
类型的东西,并且包含大约 50MB 的数据,那么可执行文件是否可以包含任何预编译的东西,无论堆栈的 haskell 等价物是什么,还是会像其他所有东西一样被延迟评估?
在此先感谢您的帮助和建议!
我很悲观。你似乎不太可能在文件上节省时间 I/O:如果你在编译时反序列化 50MB 的东西,你必须将它烘焙到可执行文件中,并且它可能会大 50MB,假设序列化格式和 GHC's format 都是相当有效的编码。因此,将可执行文件加载到内存中会变慢,大约是您之前读取数据文件所花费的时间。
同样,GHC 必须反序列化它用于将数据烘焙到可执行文件中的任何格式。如果 in-memory 数据结构与 on-disk 表示相同,程序可以避免这种情况,但我无法想象会是这种情况,因为正常的 in-memory 表示充满了指针。同样,GHC 的内部格式反序列化似乎并不比 CBOR 便宜多少,因此您通过不读取文件而避免的任何成本,都会通过使可执行文件的准备速度变慢来承担。
我正在编译一个 Haskell 可执行文件,它在启动时从使用 serialise
包序列化的文件系统中读取大约 50MB 的数据,然后在之前对其应用一些转换继续。
我想提高可执行文件的启动速度,理论上我可以使用模板haskell反序列化文件并将它们写成data
构造函数。但我想知道这是否真的会提高性能?如果代码花费的大部分时间是调用数据构造函数(意味着如果文件 IO 和反序列化很快)那么它就不值得,而如果调用数据构造函数很快那么它可能是值得的。
此外,GHC 是否有大型数据结构的编译时评估概念。也就是说,如果我有一些在编译时已知的 [Foo]
类型的东西,并且包含大约 50MB 的数据,那么可执行文件是否可以包含任何预编译的东西,无论堆栈的 haskell 等价物是什么,还是会像其他所有东西一样被延迟评估?
在此先感谢您的帮助和建议!
我很悲观。你似乎不太可能在文件上节省时间 I/O:如果你在编译时反序列化 50MB 的东西,你必须将它烘焙到可执行文件中,并且它可能会大 50MB,假设序列化格式和 GHC's format 都是相当有效的编码。因此,将可执行文件加载到内存中会变慢,大约是您之前读取数据文件所花费的时间。
同样,GHC 必须反序列化它用于将数据烘焙到可执行文件中的任何格式。如果 in-memory 数据结构与 on-disk 表示相同,程序可以避免这种情况,但我无法想象会是这种情况,因为正常的 in-memory 表示充满了指针。同样,GHC 的内部格式反序列化似乎并不比 CBOR 便宜多少,因此您通过不读取文件而避免的任何成本,都会通过使可执行文件的准备速度变慢来承担。