Mail Archives: cygwin/2001/02/13/18:29:12
jik-cygwin AT curl DOT com wrote:
>
> As I've noted separately, reading tens of thousands of files even once
> incurs a significant performance penalty. The change I've proposed
> can eliminate reading them at all.
Even stat() under Linux does at least one disk read. You can't
completely optimize away disk I/O for stat().
The main culprit is that this is one of many places where Unix doesn't
map onto Win32 well at all. The VC++ RTL doesn't use ReadFile() to
implement _stat() at all. When it checks for things like stat.st_mode
== S_IEXEC, it simply checks the filename extension for .exe, .com or
.bat. Cygwin can't do that -- it must look at the file's magic bytes to
see if it's an executable, or a #! style script.
stat() on Unixen doesn't do either of these things; all the info stat()
reports is in the inode. The info in a prototypical Unix inode is
scattered in many different places in Win32, which makes the emulator
for a call like stat() slow.
Maybe a better optimization strategy would be to patch GNU Make.
Wherever it does a stat() to find the modification time, do something
like this:
struct stat st;
#ifdef CYGWIN
WIN32_FIND_DATA findinfo;
HANDLE h = FindFirstFile(filename, &findinfo);
st.st_mtime = findinfo.ftLastWriteTime;
FindClose(h);
#else
stat(filename, &st);
#endif
(ftLastWriteTime will probably need translation into a time_t, but
that's a small matter.)
-- _
= 'Net Address: http://www.cyberport.com/~tangent | / \ ASCII Ribbon
= ICBM Address: 36.82740N, 108.02040W, alt. 1714m | \ / Campaign
= | X Against
= Chance favors the prepared mind. | / \ HTML Mail
--
Want to unsubscribe from this list?
Check out: http://cygwin.com/ml/#unsubscribe-simple
- Raw text -