代码之家  ›  专栏  ›  技术社区  ›  Saurabh Nanda

将Data.ByteString.Lazy转换为CStringLen的最有效方法

  •  0
  • Saurabh Nanda  · 技术社区  · 5 年前

    我需要将一些数据编码为JSON,然后使用hsyslog将is推送到syslog。两个相关功能的类型为:

    Aeson.encode :: a -> Data.ByteString.Lazy.ByteString
    
    System.Posix.Syslog.syslog :: Maybe Facility
                               -> Priority
                               -> CStringLen
                               -> IO () 
    

    最有效的方法是什么(速度和;内存)转换 Lazy.ByteString -> CStringLen ? 我发现 Data.ByteString.Unsafe ,但它只适用于 ByteString ,不是 Lazy.ByteString ?

    unsafeUseAsCStringLen . Data.String.Conv.toS 今天就到此为止?它是否符合效率要求?

    0 回复  |  直到 5 年前
        1
  •  1
  •   K. A. Buhr    5 年前

    我想我会用 Data.ByteString.Lazy.toStrict 代替 toS

    不管怎样,你找不到比以下更有效的方法:

    unsafeUseAsCStringLen (toStrict lbs) $ \cstrlen -> ...
    

    toStrict 是一个“昂贵”的操作,因为一个懒惰的人 ByteString ByteString公司 也不一定会载入记忆。这个 函数必须强制所有严格的 ByteString公司 ByteString公司 在没有副本之前 unsafeUseAsCStringLen 已应用。

    托斯特里克特 处理一个懒惰的 ByteString公司

    实际上, aeson Data.ByteString.Builder 创建JSON,如果JSON相当小(我认为小于4k),它将构建单个块 ByteString公司 . 在这种情况下, 是零拷贝,而且 不饱和 是零拷贝,整个操作基本上是免费的。