I was monitoring Subversion server I/O on Windows and noticed that apr_file_info_get(APR_FINFO_SIZE) involves two syscalls (QueryInformationVolume and QueryAllInformationFile). The apr_file_info_get(APR_FINFO_SIZE) is actively used by Subversion filesystem and optimizing it gives around 5-10% IO reduction.
Attached patch adds optimized codepath to apr_file_info_get() when only APR_FINFO_SIZE is requested. -- Ivan Zhakov
Index: file_io/win32/filestat.c =================================================================== --- file_io/win32/filestat.c (revision 1755968) +++ file_io/win32/filestat.c (working copy) @@ -427,6 +427,24 @@ return rv; } + /* GetFileInformationByHandle() is implemented via two syscalls: + * QueryInformationVolume and QueryAllInformationFile. Use cheaper + * GetFileSizeEx() API if we only need to get the file size. */ + if (wanted == APR_FINFO_SIZE) { + LARGE_INTEGER size; + + if (!GetFileSizeEx(thefile->filehand, &size)) { + return apr_get_os_error(); + } + + finfo->pool = thefile->pool; + finfo->fname = thefile->fname; + finfo->size = size.QuadPart; + finfo->valid = APR_FINFO_SIZE; + + return APR_SUCCESS; + } + if (!GetFileInformationByHandle(thefile->filehand, &FileInfo)) { return apr_get_os_error(); }