[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 メーリングリストの案内