Since issue #12268 has been fixed, it looks like it became easier to modify the io to use the writev() function when available. For example, if FileIO.writelines() uses writev(), it can be used by TextIOWrapper.write() through BufferedWriter. The _io.TextIOWrapper.write() method stores encoded chunks of text into a list. It can calls buffer.writlines(pending) instead of buffer.write(b''.join(pending)). I expect less Python function calls and less system calls, and so better performances because both are expensive (especially I/O syscalls). See also issue #15723. I don't know if/how readv() can be used to optimize I/O performances.
I somehow doubt that the gain is worth the trouble, vectored disk I/O is not as interesting as vectored read/writes to a NIC. Actually, a quick search returned this link: http://www.mail-archive.com/dev@httpd.apache.org/msg23763.html Running the benchmark written by the Apache guys: $ rm -f writev.out; sync; sleep 5; ./test writev: 1s526601. copy+write: 1s323405. Doesn't really surprise me. So I'm -1, since it's unlikely to yield any improvement, and will greatly complicate the code.
I get similar Fedora 18 (Linux kernel 3.8.1), ext4 filesystem: $ rm -f writev.out; sync; sleep 5; ./copy_write copy+write: 1s576530. $ rm -f writev.out; sync; sleep 5; ./writev writev: 1s686619. I agree to close the issue. At least this issue can be used later is someone else ask why Python is not using writev() ;-)
History
Date
User
Action
Args
2022-04-11 14:57:43
admin
set
github: 61855
2013-04-08 19:47:29
vstinner
set
status: open -> closedresolution: not a bugmessages: +