【问题标题】:Haskell: what is the fastest way to pipe data from handle to a handle?Haskell:将数据从句柄传递到句柄的最快方法是什么?
【发布时间】:2012-03-16 13:23:06
【问题描述】:

我该如何定义

pipe :: Handle -> Handle -> IO ()

以 Haskell 中最有效的方式(平台 2011-04 或 ghc 7.4)?


更新 1How to write a minimal-overhead proxy to localhost:3389 in Haskell?


更新 2Using GNU/Linux system call `splice` for zero-copy Socket to Socket data transfers in Haskell

使用 GNU/Linux 系统调用 splice 在两个网络套接字之间进行零拷贝数据管道,还为用 Haskell 编写的便携式套接字到套接字 splice 替代品腾出了空间,它使用 (mallocBytes, hGetBufSomehPutBuf) 在整个数据传输循环中一次性分配的用户空间缓冲区避免了微小的分配,这些分配会导致垃圾收集器重复调用 recvsendAllbytestring 包中产生压力。

【问题讨论】:

    标签: sockets haskell handle


    【解决方案1】:

    我假设您正在处理套接字,因为您的标签。

    如果是这种情况,请使用sendfile 包执行sendFile 的操作。请注意,您必须使用 Haskell 网络库和真实套接字;它不适用于句柄。

    如果您正在处理抽象句柄,则需要执行@thomas-m-dubuisson 建议的操作并明确复制句柄,因为您需要某种缓冲来提高操作效率。但是,您不应该使用惰性字节字符串,因为 hGetSome 的读取量不足以使惰性字节字符串更有效。

    almostForever $ Data.ByteString.hGetSome h1 nr >>= Data.ByteString.hPutStr h2
    

    【讨论】:

      【解决方案2】:

      我认为您不会找到任何显着优于任何非 FFI 的解决方案:

      almostForever $ Data.ByteString.hGetSome h1 nr >>= Data.ByteString.hPutStr h2
      

      或者使用惰性字节字符串可能会有所收获:

      Data.ByteString.Lazy.hGetContents  h1 >>= Data.ByteString.Lazy.hPut h2
      

      如果您有时间,请运行这些基准。如果你没有时间,那就做一个,不要太担心性能,除非它真的是个问题。

      【讨论】:

      • “如果你没有时间,那就做一个,不要太担心性能,除非它真的是个问题。” ^_^ 我想两者都会比我自己想出的要快得多。这是我第一次看到有人明确地考虑到某人的时间限制!
      • almostForever 住在哪里? Hoogle 声称找不到它。
      • @benw 如果 Hoogle 找不到它,请尝试 Hayoo。但是,在这种情况下,Hayoo 也找不到almostForever。 >,
      • +1 我个人觉得懒惰的hGetContents 是一个非常优雅和直观的解决方案。
      • @benw almostForever 只是我虚构的函数,暗示循环结构取决于提问者,可能会持续不止一个循环,而不是永远。喜欢计算ackerman 10 10
      猜你喜欢
      • 2010-10-14
      • 1970-01-01
      • 2018-04-26
      • 2013-07-14
      • 2011-04-06
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多