I'm experiencing a bottleneck in my application, Node, when writing strings to socket. Here is a benchmark where I create a web server and write a string of X bytes as a response. Compared to other systems which can do write() directly from the string buffer to file descriptor, Node is quite slow:
http://s3.amazonaws.com/four.livejournal/20100421/response_string.png I've created a "Buffer" object which allocates memory outside of V8's heap and allows one to write directly to the socket. When doing the benchmark with a "Buffer" the results are quite good: http://s3.amazonaws.com/four.livejournal/20100421/response_buffer.png So it's clear that the memcpy of a string out of V8 is the bottleneck in the previous benchmark, not the networking code. Using "Buffer" is a fine for certain situations but optimizing for strings is still important. I acknowledge that V8 cannot give raw memory access to strings due to the fact that objects get moved around - and that in most cases they're 16bit arrays, so they'd need to be UTF-8 encoded first. However, what would people think about passing the write system call to V8? I imagine a function which would take a string and file descriptor, utf8 encode it in the v8 heap (using i::ByteArray), and write that data out to the kernel, returning the number of bytes written. Something like this: ssize_t String::SocketWriteUtf8 (int fd, size_t offset); The second time SocketWriteUtf8() was called, it wouldn't need to re-encode the string, it would just use the existing data. -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users
