linux Haskell:在句柄之间传输数据最快的方法是什么?

mgdq6dx1  于 2023-06-21  发布在  Linux
关注(0)|答案(2)|浏览(98)

我该如何定义

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替代品腾出空间,该替代品使用(mallocByteshGetBufSomehPutBuf)一个-在整个数据传输循环中时间分配的用户空间缓冲区,避免了导致重复的垃圾收集器压力的微小分配从bytestring包调用recvsendAll

w9apscun

w9apscun1#

我不认为你会找到任何非FFI解决方案,显着击败:

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

或者你可以使用lazy byte字符串:

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

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

uhry853o

uhry853o2#

我假设您正在处理套接字,因为您的标记。
如果是这种情况,请使用sendfile包执行sendFile操作。注意你必须使用Haskell网络库和实套接字;有把手的话就不行了。
如果您正在处理抽象句柄,则需要按照@thomas-m-dubuisson的建议,显式地复制句柄,因为您需要某种缓冲来提高操作的效率。但是,您不应该使用惰性字节字符串,因为hGetSome的读取量不足以使惰性字节字符串更有效。

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

相关问题