Proposal: add ByteString support to unix:System.Posix.IO API
Antoine Latter
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[1]?
>
The benefit of using 'writev' over multiple calls to 'write' is the
'writev' is frequently a single kernel call - avoiding multiple
context switches.
Whether or not it is worth it to hang on to the entire bytestring to
get this advantage probably depends on the circumstance.
Antoine
More information about the Libraries
mailing list