High performance IO on non-blocking sockets

Jp Calderone exarkun at intarweb.us
Fri Mar 14 19:32:34 EST 2003


On Fri, Mar 14, 2003 at 03:22:01PM +0100, Troels Walsted Hansen wrote:
> "Richie Hindle" <richie at entrian.com> wrote in message
> news:lgm37vsi6631fimchqdivsg5vh713cifaj at 4ax.com...
> > From http://www.python.org/doc/current/lib/socket-objects.html :
> > 7.2.1 Socket Objects
> > sendall( string[, flags])
> 
> I should have mentioned that in my original post... sendall() doesn't work
> for non-blocking sockets. :(
> 
> The good news is that Kjetil Jacobsen came up with the perfect solution for
> send().
> 
>   send_buffer = buffer(self.data, self.offset)
>   sent = self.socket.send(send_buffer)
>   self.buffer_offset += sent
> 
> No copying, and all writes are as big as the socket buffer can hold. Cost of
> allocating a buffer object should be very minor in the grand scheme of
> things.

  Have you timed this, vs the original, naive code?  Slicing a string
shouldn't copy any bytes, only create a new string object with a modified
starting pointer and length.  This seems as if it would be about as
expensive as creating a new buffer object, but has the advantage of running
more of the work in C, rather than Python (no name lookup for buffer, for
example).

  I ask because I can't seem to squeeze any speedup out of Twisted by making
this change (in fact, I find a significant slowdown, 12309.8 KB/s using the
original "buf = buf[sent:]" code to 9408.2 KB/s using the buffer()
approach).

  I'm hoping I've just screwed something up, of course, and would love to
hear that the buffer() approach is, in fact, much faster :)

  Jp

-- 
Somewhere, something incredible is waiting to be known.
                -- Carl Sagan
-- 
 up 11 days, 15:59, 6 users, load average: 0.13, 0.50, 0.42





More information about the Python-list mailing list