yay \o/ Am Freitag, 26. April 2013 01:53:41 UTC+2 schrieb Marco Rogers: > > This was easily the smoothest discussion about core node changes that I've > ever been a part of. > > :Marco > > > On Thu, Apr 25, 2013 at 3:40 PM, Isaac Schlueter <[email protected]<javascript:> > > wrote: > >> The winner is option B, cork/uncork, with the behavior that end() >> automatically uncorks. Author-implemented >> _writev([{chunk,encoding},...], cb) will get called with the buffered >> writes, or _write(chunk, encoding, cb) will be called repeatedly if >> _writev is not implemented. >> >> A first-class writev([{chunk,encoding},...],cb) or >> writev([chunks...],[encodings...],cb) was a very strong contender as >> well, since it's a bit less stuff to grok, but it's also trickier to >> use and doesn't really pay enough rent to justify the added >> trickiness. >> >> Thanks for the discussion, everyone, this has been incredibly helpful. >> >> >> On Thu, Apr 25, 2013 at 2:34 PM, Tim Smart <[email protected] <javascript:>> >> wrote: >> > My vote is with B), including the amendment of uncorking automatically >> in the >> > end() call. >> > >> > res.cork() >> > res.writeHead(200, ...) >> > res.end(template.render()) >> > >> > If corked instead of using the hot path (squashing everything into one >> string to >> > write) it would use writev to combine the headers with the template >> blob/buffer. >> > >> > Tim >> > >> > On Mon, Apr 22, 2013 at 05:01:50PM -0700, Isaac Schlueter wrote: >> >> There's a syscall called `writev` that lets you write an array (ie, >> >> "Vector") of buffers of data rather than a single buffer. >> >> >> >> I'd like to support something like this for Streams in Node, mostly >> >> because it will allow us to save a lot of TCP write() calls, without >> >> having to copy data around, especially for chunked encoding writes. >> >> (We write a lot of tiny buffers for HTTP, it's kind of a nightmare, >> >> actually.) >> >> >> >> Fedor Indutny has already done basically all of the legwork to >> >> implement this. Where we're stuck is the API surface, and here are >> >> some options. Node is not a democracy, but your vote counts anyway, >> >> especially if it's a really good vote with some really good argument >> >> behind it :) >> >> >> >> Goals: >> >> 1. Make http more good. >> >> 2. Don't break existing streams. >> >> 3. Don't make things hard. >> >> 4. Don't be un-node-ish >> >> >> >> For all of these, batched writes will only be available if the >> >> Writable stream implements a `_writev()` method. No _writev, no >> >> batched writes. Any bulk writes will just be passed to _write(chunk, >> >> encoding, callback) one at a time in the order received. >> >> >> >> In all cases, any queued writes will be passed to _writev if that >> >> function is implemented, even if they're just backed up from a slow >> >> connection. >> >> >> >> >> >> Ideas: >> >> >> >> >> >> A) stream.bulk(function() { stream.write('hello'); >> >> stream.write('world'); stream.end('!\n') }) >> >> >> >> Any writes done in the function passed to `stream.bulk()` will be >> >> batched into a single writev. >> >> >> >> Upside: >> >> - Easier to not fuck up and stay frozen forever. There is basically >> >> zero chance that you'll leave the stream in a corked state. (Same >> >> reason why domain.run() is better than enter()/exit().) >> >> >> >> Downsides: >> >> - easier to fuck up and not actually batch things. eg, >> >> s.bulk(function(){setTimeout(...)}) >> >> - bulk is a weird name. "batch" maybe? Nothing else really seems >> >> appropriate either. >> >> - somewhat inflexible, since all writes have to be done in the same >> >> function call >> >> >> >> >> >> B) stream.cork(); stream.write('hello'); stream.write('world'); >> >> stream.end('!\n'); stream.uncork(); >> >> >> >> Any writes done while corked will be flushed to _writev() when >> uncorked. >> >> >> >> Upside: >> >> - Easy to implement >> >> - Strictly more flexible than stream.bulk(writer). (Can trivially >> >> implement a bulk function using cork/uncork) >> >> - Useful for cases outside of writev (like corking a http request >> >> until the connection is established) >> >> >> >> Downsides: >> >> - Easy to fuck up and stay corked forever. >> >> - Two functions instead of just one (double the surface area increase) >> >> >> >> >> >> C) stream.writev([chunks,...], [encodings,...], callback) >> >> >> >> That is, implement a first-class top-level function called writev() >> >> which you can call with an array of chunks and an array of encodings. >> >> >> >> Upside: >> >> - No unnecessary surface area increase >> >> - NOW IT'S YOUR PROBLEM, NOT MINE, HAHA! (Seriously, though, it's >> >> less magical, simpler stream.Writable implementation, etc.) >> >> >> >> Downside: >> >> - A little bit tricky when you don't already have a list of chunks to >> >> send. (For example, with cork, you could write a bunch of stuff into >> >> it, and then uncork all at the end, and do one writev, even if it took >> >> a few ms to get it all.) >> >> - parallel arrays, ew. >> >> >> >> >> >> D) stream.writev([ {chunk:buf, encoding: blerg}, ...], callback) >> >> >> >> That is, same as C, but with an array of {chunk,encoding} objects >> >> instead of the parallel arrays. >> >> >> >> Same +/- as C, except the parallel array bit. This is probably how >> >> we'd call the implementation's stream._writev() anyway, so it'd be a >> >> bit simpler. >> >> >> >> >> >> >> >> Which of these seems like it makes the most sense to you? >> >> >> >> Is there another approach that you'd like to see here? (Note: "save >> >> all writes until end of tick always" and "copy into one big buffer" >> >> approaches are not feasible for obvious performance reasons.) >> >> >> >> -- >> >> -- >> >> Job Board: http://jobs.nodejs.org/ >> >> Posting guidelines: >> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> >> You received this message because you are subscribed to the Google >> >> Groups "nodejs" group. >> >> To post to this group, send email to [email protected]<javascript:> >> >> To unsubscribe from this group, send email to >> >> [email protected] <javascript:> >> >> For more options, visit this group at >> >> http://groups.google.com/group/nodejs?hl=en?hl=en >> >> >> >> --- >> >> You received this message because you are subscribed to the Google >> Groups "nodejs" group. >> >> To unsubscribe from this group and stop receiving emails from it, send >> an email to [email protected] <javascript:>. >> >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> >> >> > >> > -- >> > -- >> > Job Board: http://jobs.nodejs.org/ >> > Posting guidelines: >> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> > You received this message because you are subscribed to the Google >> > Groups "nodejs" group. >> > To post to this group, send email to [email protected]<javascript:> >> > To unsubscribe from this group, send email to >> > [email protected] <javascript:> >> > For more options, visit this group at >> > http://groups.google.com/group/nodejs?hl=en?hl=en >> > >> > --- >> > You received this message because you are subscribed to the Google >> Groups "nodejs" group. >> > To unsubscribe from this group and stop receiving emails from it, send >> an email to [email protected] <javascript:>. >> > For more options, visit https://groups.google.com/groups/opt_out. >> > >> > >> >> -- >> -- >> Job Board: http://jobs.nodejs.org/ >> Posting guidelines: >> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines >> You received this message because you are subscribed to the Google >> Groups "nodejs" group. >> To post to this group, send email to [email protected]<javascript:> >> To unsubscribe from this group, send email to >> [email protected] <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/nodejs?hl=en?hl=en >> >> --- >> You received this message because you are subscribed to a topic in the >> Google Groups "nodejs" group. >> To unsubscribe from this topic, visit >> https://groups.google.com/d/topic/nodejs/UNWhF64KeQI/unsubscribe?hl=en. >> To unsubscribe from this group and all its topics, send an email to >> [email protected] <javascript:>. >> For more options, visit https://groups.google.com/groups/opt_out. >> >> >> > > > -- > Marco Rogers > [email protected] <javascript:> | https://twitter.com/polotek > > Life is ten percent what happens to you and ninety percent how you respond > to it. > - Lou Holtz >
-- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines You received this message because you are subscribed to the Google Groups "nodejs" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/nodejs?hl=en?hl=en --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
