3

假设我需要以Data.Time.UTCTime“%Y-%m-%d %H:%M:%S”格式多次写入/读取文件。

在我看来,使用Data.Time.formatTimeorData.Time.parseTime转换UTCTime为/从String,然后打包/解包Stringto/fromByteString会太慢,因为它涉及中间String. 但是手动编写ByteString构建器/解析器UTCTime似乎重复了很多已经在formatTimeand中完成的工作parseTime

我想我的问题是:是否有一种系统的方法可以在不重复大量工作的情况下获得类型函数t -> StringString -> t转换为函数t -> ByteString或提高效率?ByteString -> t

我完全是一个 Haskell 新手,所以如果这个问题很愚蠢,请原谅我。

4

2 回答 2

4

不,没有将 type 函数转换为 type 函数的通用t -> String方法t -> ByteString。如果您记得 ByteString 不仅仅是一个更快的String;它可能会帮助您适应这个现实。它比那低。AByteString是字节序列;除非您考虑到编码,否则它没有任何意义。

所以你的选择是:

  1. 使用函数组合,如 phg 的回答:

    import Data.ByteString.Char8 as B
    
    timeToByteStr :: UTCTime -> ByteString
    timeToByteStr = B.pack . formatTime'
    
    parseBStrTime :: ByteString -> Maybe UTCTime
    parseBStrTime = parseTime' . B.unpack
    

    我已经更正了函数名称。我还使用了例如 parseTime' 而不是 parseTime 来省略格式字符串,TimeLocale您需要传入。

    (还值得注意的是,这Data.Text通常是比 更好的选择Data.ByteString.Char8。只有当您Char的 s 属于 Unicode 代码点 0-255 时,后者才能正常工作。)

  2. 如果性能是一个问题并且这种转换是瓶颈,请编写一个解析器/构建器。

  3. 只需使用Strings。

最后一个选项对于 Haskell 新手来说是一个被低估的选择,恕我直言。String在性能方面是次优的,但它不是魔鬼的产物。如果你刚刚开始使用 Haskell,为什么不让你的生活尽可能简单,除非你的代码变得太慢?

于 2012-09-04T22:55:29.310 回答
-3

如果您不是真的需要高度优化的代码,通常和最简单的方法是使用函数组合:

timeToByte = toBytes . formatTime
byteToTime = parseTime . fromBytes

或类似的东西,因为我不熟悉这些库。

如果在分析之后您发现这种方法仍然很慢,我想您将不得不手动编写一些东西。

于 2012-09-04T17:17:40.270 回答