git/compat
Marius Storm-Olsen 5411bdc4e4 Windows: Add a new lstat and fstat implementation based on Win32 API.
This gives us a significant speedup when adding, committing and stat'ing files.
Also, since Windows doesn't really handle symlinks, we let stat just uses lstat.
We also need to replace fstat, since our implementation and the standard stat()
functions report slightly different timestamps, possibly due to timezones.

We simply report UTC in our implementation, and do our FILETIME to time_t
conversion based on the document at http://support.microsoft.com/kb/167296.

With Moe's repo structure (100K files in 100 dirs, containing 2-4 bytes)
    mkdir bummer && cd bummer; for ((i=0;i<100;i++)); do
      mkdir $i && pushd $i;
        for ((j=0;j<1000;j++)); do echo "$j" >$j; done;
      popd;
    done

We get the following performance boost:

    With normal lstat & stat  Custom lstat/fstat
    ------------------------  ------------------------
    Command: git init         Command: git init
    ------------------------  ------------------------
    real    0m 0.047s          real   0m 0.063s
    user    0m 0.031s          user   0m 0.015s
    sys     0m 0.000s          sys    0m 0.015s
    ------------------------  ------------------------
    Command: git add .        Command: git add .
    ------------------------  ------------------------
    real    0m19.390s         real    0m12.031s       1.6x
    user    0m 0.015s         user    0m 0.031s
    sys     0m 0.030s         sys     0m 0.000s
    ------------------------  ------------------------
    Command: git commit -a..  Command: git commit -a..
    ------------------------  ------------------------
    real    0m30.812s         real    0m16.875s       1.8x
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.015s
    ------------------------  ------------------------
    3x Command: git-status    3x Command: git-status
    ------------------------  ------------------------
    real    0m11.860s         real    0m 5.266s       2.2x
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.015s         sys     0m 0.015s

    real    0m11.703s         real    0m 5.234s
    user    0m 0.015s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.000s

    real    0m11.672s         real    0m 5.250s
    user    0m 0.031s         user    0m 0.015s
    sys     0m 0.000s         sys     0m 0.000s
    ------------------------  ------------------------
    Command: git commit...    Command: git commit...
    (single file)             (single file)
    ------------------------  ------------------------
    real    0m14.234s         real    0m 7.735s       1.8x
    user    0m 0.015s         user    0m 0.031s
    sys     0m 0.000s         sys     0m 0.000s

Signed-off-by: Marius Storm-Olsen <mstormo_git@storm-olsen.com>
Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at>
2008-06-26 08:45:10 +02:00
..
fnmatch.c Add compat/regex.[ch] and compat/fnmatch.[ch]. 2008-06-22 11:32:33 +02:00
fnmatch.h Add compat/regex.[ch] and compat/fnmatch.[ch]. 2008-06-22 11:32:33 +02:00
fopen.c compat/fopen.c: avoid clobbering the system defined fopen macro 2008-05-08 17:43:01 -07:00
hstrerror.c Add a local implementation of hstrerror for the system which do not have it 2007-06-15 22:48:34 -07:00
inet_ntop.c Remove a couple of duplicated include 2007-11-05 20:50:38 -08:00
inet_pton.c Remove a couple of duplicated include 2007-11-05 20:50:38 -08:00
memmem.c add memmem() 2007-09-06 22:46:00 -07:00
mingw.c Windows: Add a new lstat and fstat implementation based on Win32 API. 2008-06-26 08:45:10 +02:00
mingw.h Windows: Add a new lstat and fstat implementation based on Win32 API. 2008-06-26 08:45:10 +02:00
mkdtemp.c Define compat version of mkdtemp for systems lacking it 2007-10-20 22:52:21 -04:00
mmap.c War on whitespace 2007-06-07 00:04:01 -07:00
pread.c Replacing the system call pread() with lseek()/xread()/lseek() sequence. 2007-01-09 16:40:40 -08:00
qsort.c compat: Add simplified merge sort implementation from glibc 2008-02-06 22:35:28 -08:00
regex.c Add compat/regex.[ch] and compat/fnmatch.[ch]. 2008-06-22 11:32:33 +02:00
regex.h Add compat/regex.[ch] and compat/fnmatch.[ch]. 2008-06-22 11:32:33 +02:00
setenv.c simplify inclusion of system header files. 2006-12-20 09:51:35 -08:00
snprintf.c Add target architecture MinGW. 2008-06-22 11:32:45 +02:00
strcasestr.c Clean up compatibility definitions. 2005-12-05 15:50:29 -08:00
strlcpy.c simplify inclusion of system header files. 2006-12-20 09:51:35 -08:00
strtoumax.c Add a compat/strtoumax.c for Solaris 8. 2007-02-19 18:20:30 -08:00
unsetenv.c simplify inclusion of system header files. 2006-12-20 09:51:35 -08:00