Ben> I ran the Cywgin `xemacs'; I notice it's quite fast
once
it starts
Ben> up but dog-slow doing so.
Ben> I imagine much of the time is spent doing multiple stats down
Ben> through the package tree.
Unless something's changed that I don't know about, it does
only one pass. But you're right that they take up some time.
I see.
Ben> Then, next time, use this cache instead of actually reading
the
Ben> directories. However, go through each resulting directory in
Ben> load-path and stat it to see what the modification time
is; if so,
Ben> we need to discard the file listing for that directory
and reread
Ben> it (thereby potentially adding new directories to the cache that
Ben> need to be recursed into, or removing directory trees from the
Ben> cache).
It seems to me this would incur the same number of stats as
we have. We don't actually stat the individual files---just
the directories. Or am I misunderstanding something you said?
Well, in that case my strategy would require only a single stat, not a stat
of each directory. I was assuming you had to stat each file of each
directory to see if it was a subdirectory.
Btw I just did an strace under Cygwin and found some interesting things.
Unfortunately the results appear skewed; could some people under Unix run
strace (trace, truss, etc.) and send me the results?
Some things I noticed:
-- each .xpm file in the toolbar is getting loaded 3 times -- once when the
fallback, once when the X value, once when the mswin value. Under Cygwin,
for some reason, these loads are taking absolutely forever; maybe it's
because we're using XpmReadDataFromFile. Simple caching could avoid the 3x
load, but I wonder if we shouldn't just dump the XPM info directly into the
exe?
-- every time you load an autoload, you get the following sequence:
1. stat foo.elc. This occurs in locate_file_in_directory_mapper,
`locate-file' from `load'.
2. access foo.elc. From locate_file_open_or_access_file, same..
3. stat foo.elc. From `insert-file-contents' from `find-magic-cookie...'
from `load'.
4. open foo.elc. From same.
5. lseek(#, 1, SEEK_SET); lseek(#, 0, SEEK_CUR); fstat; readv(808 bytes);
readv(0 bytes); lseek(#, 1, SEEK_SET); readv(808 bytes); readv(0 bytes);
readv(0 bytes); close. From same.
6. stat foo.elc. This occurs in locate_file_in_directory_mapper,
`locate-file' from `load-internal'.
7. open foo.elc. From locate_file_open_or_access_file, same.
8. fstat. From load-internal, checking for out-of-date elc.
9. stat foo.el. From same.
10. lseek(#, 0, SEEK_CUR); fstat; lseek(#, 0, SEEK_SET); readv(809 bytes);
readv(0 bytes); readv(0 bytes); close
A lot of statting here for one file.
#5 appears to be
lseek(#, 1, SEEK_SET) from insert-file-contents-internal
lseek(#, 0, SEEK_CUR) from make_filedesc_stream_1
fstat from filedesc_seekable_p, undecided_init_coding_stream
read(3000, returns 808 bytes) from i-f-c-i -> Lstream_read -> coding_reader
-> Lstream_read -> filedesc_reader
read(0, returns 0 bytes) from same
lseek(#, 1, SEEK_SET) ??? Can't find this
read = readv(808 bytes) ??? Can't find this
read = readv(0 bytes) ??? Can't find this
read(0, returns 0 bytes) from same
close
#10 appears to be
lseek(#, 0, SEEK_CUR) from make_filedesc_stream_1
fstat ??? Can't find this
lseek(#, 0, SEEK_SET) ??? Can't find this
read(8192, returns 809 bytes)
read(8192, returns 0 bytes)
read(8192, returns 0 bytes)
close
"Can't find this" is presumably because something changed (for the better)
between 21.4 and 21.5; but it might be a Windows-Cygwin difference, since
the strace is 21.4 Cygwin and the debugging is 21.5 Windows.
BTW the 1 in lseek is due to the "son of a bitch" bug I just corrected.