[Mew-dist 16229] directory-files is too slow
Kazu Yamamoto ( 山本和彦 )
kazu at example.com
2001年 2月 7日 (水) 21:21:43 JST
半田さん、たびたびすみません。
Mew にも関係ありますので、mew-dist に Cc: しています。
Emacs 21.0.97 の directory-files はとても遅いです。15721 個ファイルを
格納するディレクトリに対し、directory-files を実行し、プロファイルをとっ
てみると添付資料のようになります。(FreeBSD/NetBSD 両方で同じ結果になり
ました。)
*** Emacs 21.0.97 は Emacs 20.7 の 20 倍ぐらい遅いようです。***
Emacs 21.0.97 の dired.c:directory_files_internal の、
name = DECODE_FILE (name);
len = STRING_BYTES (XSTRING (name));
部分を外すと、(3) のように 2 倍速くなります。(注:実験した呼び出し方で
は、この部分は不要。)
Emacs 20.7 のソースと見比べながら、他にもいろいろやってみましたが、ど
こが支配的なのかよく分りませんでした。とにかく、改良の余地はたくさんあ
りそうです。
なお、この関数の最後に、
#ifdef EAGAIN
retry_p |= errno == EAGAIN;
#endif
#ifdef EINTR
retry_p |= errno == EINTR;
#endif
というコードがありますが、個人的にはあまり感心しません。
まず、エラーが起っていることを確かめた後に、errno を参照すべきです。ど
のシステムコールのエラーを拾おうとしているのか、不明瞭に思います。(こ
の部分が、directory_files_internal の速度に影響を及ぼしていない、つま
り retry していないことは確かめました。)
--かず
------------------------------------------------
(i) Emacs 20.7
Function Calls Total time (sec) Avg time per call
======== ====== ================ =================
kazu-foo 5 1.095547 0.219109
(2) Emacs 21.0.97 original
Function Calls Total time (sec) Avg time per call
======== ====== ================ =================
kazu-foo 5 19.817215 3.963443
(3) Emacs 21.0.97 original
Function Calls Total time (sec) Avg time per call
======== ====== ================ =================
kazu-foo 5 7.593457 1.518691
ここで、kazu-foo は、directory-files のための wrapper です。
---
(defun kazu-foo ()
(directory-files "dir" nil nil 'no-sort))
---
------------------------------------------------
Mew-dist メーリングリストの案内