[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
CCL (was: w3mmee vs emacs-w3m problems)
>> On Mon, 14 May 2001 11:59:24 +0900 (JST)
>> h-saka@lsi.nec.co.jp (Hironori Sakamoto) said as follows:
>せっかく Mule なのですから x-moe-internal (や w3m-m17n の内部コード)
>も private charset として扱えるといいのではと思います。
という実装案は以前から考えてはいたのですが、知識不足で実装できずに足踏
みしていました。
現在は w3m -halfdump の出力を raw-text として一旦バッファに貯めておき、
この中の EUC-JP に適合しない内部文字を置換してから、バッファ全体を
EUC-JP として解釈するという手順を踏んでいます。しかし、w3m の内部コー
ドをそのまま文字コードとして定義することができれば、その文字コードを使っ
て読み込めば良いだけになるはずで、しかも高速化も期待できると思われます。
で、ようやく CCL の書き方が少し分かったので、以下のようなコードを書い
て試してみました。
# こんなのでいいのか、まったく理解が足りていない状態ですので、識者の皆
# さんの添削を希望します。
(require 'pccl)
(define-ccl-program w3m-internal-decode
`(2
(loop
(read r0)
(if (r0 < 128)
(write-repeat r0)
(if (r0 == 128)
(write-repeat 32)
(if (r0 == 144)
(write-repeat 32)
(if (r0 == 160)
(write-repeat 32)))))
(read r1)
(write ,(if (boundp 'MULE)
lc-jp
(charset-id 'japanese-jisx0208)))
(write r0)
(write-repeat r1))))
(define-ccl-program w3m-internal-encode
`(1
(loop
(read r0)
(write-repeat r0))))
(make-ccl-coding-system
'w3m-internal ?E "w3m internal coding system"
'w3m-internal-decode 'w3m-internal-encode)
;; (with-current-buffer (get-buffer-create "*TEST*")
;; (erase-buffer)
;; (let ((coding-system-for-read 'w3m-internal)
;; (default-process-coding-system (cons 'w3m-internal '*noconv*)))
;; (call-process "w3m" nil t nil "-halfdump" "http://namazu.org/~tsuchiya/emacs-w3m/")))
(defun w3m-rendering-region (start end)
"Do rendering of contents in this buffer as HTML and return title."
(save-restriction
(narrow-to-region start end)
(let ((coding-system-for-write w3m-input-coding-system)
(coding-system-for-read 'w3m-internal)
(default-process-coding-system
(cons 'w3m-internal w3m-input-coding-system)))
(if w3m-use-form
(w3m-form-parse-region start end))
(w3m-message "Rendering...")
(apply 'call-process-region
start end w3m-command t t nil
(mapcar (lambda (x)
(if (stringp x)
x
(prin1-to-string (eval x))))
(append (list w3m-halfdump-option)
w3m-halfdump-command-arguments
w3m-halfdump-expand-options)))
(w3m-message "Rendering... done")
(goto-char (point-min))
;; FIXME: Adhoc support for w3m with patch in [w3m-dev 01876].
(and (looking-at "<!DOCTYPE w3mhalfdump public")
(search-forward "\n<pre>\n" nil t)
(delete-region (point-min) (1+ (match-beginning 0))))
(let (title)
(dolist (regexp '("<title_alt[ \t\n]+title=\"\\([^\"]+\\)\">"
"<title>\\([^<]\\)</title>"))
(goto-char (point-min))
(when (re-search-forward regexp nil t)
(setq title (match-string 1))
(delete-region (match-beginning 0) (match-end 0))))
(if (and (null title)
(stringp w3m-current-url)
(< 0 (length (file-name-nondirectory w3m-current-url))))
(setq title (file-name-nondirectory w3m-current-url)))
(setq w3m-current-title (or title "<no-title>"))))))
それで、ベンチマークを取ってみたのですが、結果は…。
(progn
(require 'elp)
(require 'w3m)
(load (expand-file-name "~/w3m-internal-euc-ccl.elc"))
(elp-instrument-list '(w3m-goto-url w3m-rendering-region))
(let ((i 20))
(while (> i 0)
(w3m-goto-url "http://localhost/~tsuchiya/")
(setq i (1- i))))
(elp-results))
;;; Emacs21
;; 現在の実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 9.9683480000 0.4984174000
; w3m-rendering-region 20 2.483242 0.1241621000
;; CCL を使った実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 9.2289780000 0.4614489000
; w3m-rendering-region 20 2.4812129999 0.1240606499
;;; Emacs20
;; 現在の実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 3.75456 0.187728
; w3m-rendering-region 20 2.4790649999 0.1239532499
;; CCL を使った実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 3.7287630000 0.1864381500
; w3m-rendering-region 20 2.481663 0.12408315
;;; Mule2.3@19.34
;; 現在の実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-rendering-region 20 2.5255069999 0.1262753499
; w3m-goto-url 20 3.2353990000 0.1617699500
;; CCL を使った実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-rendering-region 20 2.4681450000 0.1234072500
; w3m-goto-url 20 3.2181019999 0.1609050999
;;; XEmacs 21.1 (patch 10) "Capitol Reef" [Lucid]
;; 現在の実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 10.627474000 0.5313737000
; w3m-rendering-region 20 2.7317840000 0.1365892000
;; CCL を使った実装
; Function Name Call Count Elapsed Time Average Time
; ==================== ========== ============ ============
; w3m-goto-url 20 9.7842789999 0.4892139499
; w3m-rendering-region 20 2.5654680000 0.1282734000
ほとんど誤差ですね、これは。最後の XEmacs だけが極端に遅いのが気になり
ますが。
x-moe-internal とか、将来の w3m-m17n の内部コードに対応しようとすると、
避けて通ることは出来ないと思うので、もう少し研究してみようと思います。
--
土屋 雅稔 ( TSUCHIYA Masatoshi )
http://www-nagao.kuee.kyoto-u.ac.jp/member/tsuchiya/