[Date Prev][Date Next][Thread Prev][][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/