In this specific case you could use Stdio.Buffer instead.
Change writeme to be a buffer, then add to it using ->add(string)
In the socket_write function, you only need this:
if( sizeof( con->_writeme ) ) con->_writeme->output_to(con->_socket);
This should be O(1) regardless of the buffer size, and in general slightly faster than strings even for short:ish buffers.
On Wed, Aug 19, 2015 at 2:39 AM, Chris Angelico rosuav@gmail.com wrote:
On Wed, Aug 19, 2015 at 6:13 AM, Per Hedbor () @ Pike (-) developers forum 10353@lyskom.lysator.liu.se wrote:
Another advantage with this method is that it is reasonably trivial to add new string types. As an example that I am seriously considering: A string that is a tail port of another string.
The tail-string would be used for this somewhat unfortunate but rather common coding pattern:
sscanf( str, "%2c%s", part, str );
and, in a similar manner:
len = file->write(str); str = str[written..]
These are both O(n^2), but if tail-of string are added they could both be about O(n), only reallocate the data if more than 50% is wasted.
This specific improvement would be useful to this code, although I'm noticing the slowdown only when I do stupid stuff for benchmarking.
https://github.com/Rosuav/Hogan/blob/master/hogan.pike#L25
Figuring out a good chunk size in application code is hard. If I could simply code idiomatically without chunking, and let the language worry about efficiency, it'd be awesome.
ChrisA