我该如何定义
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
)一个-在整个数据传输循环中时间分配的用户空间缓冲区,避免了导致重复的垃圾收集器压力的微小分配从bytestring
包调用recv
、sendAll
。
2条答案
按热度按时间w9apscun1#
我不认为你会找到任何非FFI解决方案,显着击败:
或者你可以使用lazy byte字符串:
如果你有时间的话,可以运行一个基准测试。如果你没有时间,那就做一个,不要太担心性能,除非它确实是一个问题。
uhry853o2#
我假设您正在处理套接字,因为您的标记。
如果是这种情况,请使用
sendfile
包执行sendFile
操作。注意你必须使用Haskell网络库和实套接字;有把手的话就不行了。如果您正在处理抽象句柄,则需要按照@thomas-m-dubuisson的建议,显式地复制句柄,因为您需要某种缓冲来提高操作的效率。但是,您不应该使用惰性字节字符串,因为
hGetSome
的读取量不足以使惰性字节字符串更有效。