Haskell:将数据从句柄传递到句柄的最快方法是什么?

时间:2012-02-27 00:46:34

标签: sockets haskell handle

如何定义

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

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


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


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

使用GNU / Linux系统调用splice在两个网络套接字之间进行零拷贝数据管道,也为在Haskell中编写的便携式套接字到套接字splice代替腾出空间,后者使用( mallocByteshGetBufSomehPutBuf)在整个数据传输循环中一次性分配用户空间缓冲区,避免了重复调用{{1}导致垃圾收集器受压的微小分配来自recv包的sendAll

2 个答案:

答案 0 :(得分:1)

我不认为你会发现任何非FFI解决方案都明显优于:

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

或许您可以使用延迟字节字符串获得一些收益:

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

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

答案 1 :(得分:1)

我认为你正在处理套接字,因为你的标签。

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

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

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