On Fri, Jul 10, 2009 at 03:30:24AM +0400, Dmitry Potapov wrote:
opendir gives an extra 'stat' before opening directory
readdir produces one more extra 'stat' on the parent directory before
returning '..'
open(.gitignore) does one extra 'stat' on the directory where it tries
to open .gitignore (it did not exist in my tests)So, the number of 'stat' on each directory is 2 plus the number of
subidectories that it has. Thus, the total number of 'stat' for all
directories is 3 multiple the number of directories in your repo. All
those 'stat' are artifacts of Cygwin. Also, you have 2 open per each
directory and one of them are redundant (at least, for Git purposes).
Overall (including syscalls for .gitignore), you have the following
number of syscalls for each directory in your repo:
5 - QueryOpen (stat)
3 - CreateFile (open)
2 - CloseFile (close)
1 - QueryFileInternalInformationFile
Here is the detail listing of testing of read_directory_recursive:
=====
opendir(.)
QueryOpen,E:\dpotapov\repo
CreateFile,E:\dpotapov\repo
first readdir call
QueryDirectory,E:\dpotapov\repo
second readdir call that returns '..'
QueryOpen,E:\dpotapov
CreateFile,E:\dpotapov
QueryFileInternalInformationFile,E:\dpotapov
CloseFile,E:\dpotapov
open(.gitignore) -- .gitignore does not exist
QueryOpen,E:\dpotapov\repo\.gitignore
QueryOpen,E:\dpotapov\repo\.gitignore.lnk
QueryOpen,E:\dpotapov\repo
CreateFile,E:\dpotapov\repo\.gitignore
stat for untracked file
QueryOpen,E:\dpotapov\repo\bar
opendir(dir1)
QueryOpen,E:\dpotapov\repo\dir1
CreateFile,E:\dpotapov\repo\dir1
first readdir call
QueryDirectory,E:\dpotapov\repo\dir1
second readdir call that returns '..'
QueryOpen,E:\dpotapov\repo
CreateFile,E:\dpotapov\repo
QueryFileInternalInformationFile,E:\dpotapov\repo
CloseFile,E:\dpotapov\repo
open(.gitignore) -- .gitignore does not exist
QueryOpen,E:\dpotapov\repo\dir1\.gitignore
QueryOpen,E:\dpotapov\repo\dir1\.gitignore.lnk
QueryOpen,E:\dpotapov\repo\dir1
CreateFile,E:\dpotapov\repo\dir1\.gitignore
last readdir call that returns NULL
QueryDirectory,E:\dpotapov\repo\dir1
closedir
CloseFile,E:\dpotapov\repo\dir1
stat for some modified file
QueryOpen,E:\dpotapov\repo\foo
last readdir call that returns NULL
QueryDirectory,E:\dpotapov\repo
closedir
CloseFile,E:\dpotapov\repo
=====
Dmitry