如何定义
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
代替腾出空间,后者使用( mallocBytes
,hGetBufSome
和hPutBuf
)在整个数据传输循环中一次性分配用户空间缓冲区,避免了重复调用{{1}导致垃圾收集器受压的微小分配来自recv
包的sendAll
。
答案 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)