Proposal: add ByteString support to unix:System.Posix.IO API
aslatter at gmail.com
Wed Mar 2 07:58:39 CET 2011
On Tue, Mar 1, 2011 at 9:23 PM, wren ng thornton <wren at freegeek.org> wrote:
> On 3/1/11 1:35 AM, Bryan O'Sullivan wrote:
>> I want to see four entry points for writing:
>> fdWrite :: Strict.ByteString -> IO Int
>> fdWriteAll :: Strict.ByteString -> IO ()
>> fdWritev :: [Strict.ByteString] -> IO Int -- turn the list into an iovec,
>> then call writev
>> fdWritevAll :: [Strict.ByteString] -> IO ()
> Using writev requires the length of the list in order to get a count of
> chunks, which forces us to hold the whole list/lazy-bytestring in memory at
> once and also adds O(n) time for traversing it. Also it'd require converting
> each of the ByteString structs into iovec structs (whereas using write
> allows this to be unpacked into the call frames for write).
> What's the benefit of doing this? Is writev that much more efficient than
> Haskell code with the same semantics?
The benefit of using 'writev' over multiple calls to 'write' is the
'writev' is frequently a single kernel call - avoiding multiple
Whether or not it is worth it to hang on to the entire bytestring to
get this advantage probably depends on the circumstance.
More information about the Libraries