[Mew-dist 04750] emacs profile
Kazu Yamamoto ( 山本和彦 )
Kazu at example.com
1998年 5月 18日 (月) 21:34:13 JST
今まで Mew をプロファイラーにかけたことはありませんでしたが、今日尾上
さんに 「Libretto では使いものにならない」と言われ、焦ってプロファイラー
を探してみました。結論としては、Emacs 19 以降には profile.el が付いて
きており、少なくとも Emacs 20 以降の profile.el は使えることが分かりま
した。
使い方:
(1) Mew を起動する
e.g. M-x mew
(2) profile.el を読み込む
e.g. M-x load-library + "profile"
Emacs 20 だと lisp/emacs-lisp/profile.el が読み込まれ
る。Emacs 20 のは (require 'profile) でいいかな。
(3) profile-functions-list に解析したい関数を定義。
e.g. (setq profile-functions-list
'(mew-decode
mew-decode-message
mew-decode-rfc822-header
mew-decode-singlepart
mew-decode-multipart
mew-decode-mime-header
mew-header-arrange
mew-highlight-header-region
mew-cache-message))
(4) 上記の設定を反映させる
e.g. M-x profile-functions
(4) Mew で適当に遊ぶ。
(5) 結果を表示
e.g. M-x profile-results
---
Function Calls Total time (sec) Avg time per call
=========================== ====== ================ =================
mew-cache-message 45 6.208570 0.137968
mew-highlight-header-region 45 1.195176 0.026559
mew-header-arrange 45 3.836575 0.085257
mew-decode-mime-header 39 0.400267 0.010263
mew-decode-multipart 2 0.103326 0.051663
mew-decode-singlepart 35 0.847463 0.024213
mew-decode-rfc822-header 45 2.888192 0.064182
mew-decode-message 45 4.179244 0.092872
mew-decode 45 5.799290 0.128873
---
案の定、mew-header-arrange が遅いようです。mew-decode が遅いのは、入出
力のためだと信じていますが、本当にそうかはこれから確かめます。
私一人で解析するのは限界がありますので、遅いと思う関数を適宜設定して検
査し、やっぱり遅かったら教えて欲しいです。遅い関数を中心に高速化を考え
ます。
P.S.
profile というコマンドがまぜか "z\np\n" という予期せぬ文字列を返すので、
標準の profile.el では 1 回だけエラーが発生します。以下のパッチで無視
できますが、まぁ本質的でないので気にしなければそれでよいみたいです。
--かず
-------------- next part --------------
*** profile.el.orig Mon May 18 21:10:29 1998
--- profile.el Mon May 18 21:13:29 1998
***************
*** 107,114 ****
(defun profile-filter (process input)
"Filter for the timer process. Sets `profile-time' to the returned time."
! (if (zerop (string-match "\\." input))
! (error "Bad output from %s" profile-timer-program)
(setcar profile-time
(string-to-int (substring input 0 (match-beginning 0))))
(setcdr profile-time
--- 107,114 ----
(defun profile-filter (process input)
"Filter for the timer process. Sets `profile-time' to the returned time."
! (if (null (string-match "\\." input))
! ()
(setcar profile-time
(string-to-int (substring input 0 (match-beginning 0))))
(setcdr profile-time
Mew-dist メーリングリストの案内