【问题标题】:Converting Data.Time.UTCTime to / from ByteString将 Data.Time.UTCTime 转换为/从 ByteString
【发布时间】:2012-09-04 17:01:46
【问题描述】:

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

在我看来,使用Data.Time.formatTime 或Data.Time.parseTime 将UTCTime 转换为/从String 然后将String 打包/解包到ByteString 会太慢,因为它涉及中间String。但是手动编写UTCTime 的ByteString builder/parser 似乎重复了formatTime 和parseTime 中已经完成的大量工作。

我想我的问题是:有没有一种系统的方法可以将 t -> String 或 String -> t 类型的函数转换为 t -> ByteString 或 ByteString -> t 以提高效率而无需重复大量工作?

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

【问题讨论】:

  • 这不是一个愚蠢的问题。

标签: haskell bytestring


【解决方案1】:

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

所以你的选择是:

  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 更好的选择。只有当您的Chars 位于 Unicode 代码点 0-255 中时,后者才能正常工作。)

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

  3. 只需使用Strings。

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

【讨论】:

【解决方案2】:

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

timeToByte = toBytes . formatTime
byteToTime = parseTime . fromBytes

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

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

【讨论】:

  • 你为什么不担心效率?如果@shih 必须尽快完成一百万次这样的转换怎么办?
猜你喜欢
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2016-07-18
相关资源
最近更新 更多