flim-1_13-rfc2231 vs flim-1_14-rfc2231 (Re: flim-1_14-rfc2231)
Shuhei KOBAYASHI
shuhei @ aqua.ocn.ne.jp
2001年 4月 29日 (日) 13:56:04 JST
FLIM の RFC 2231 対応の main trunk への merge を検討しているのですが...
>>>>> In <86pug42otj.fsf @ aqua.ocn.ne.jp>,
>>>>> Shuhei KOBAYASHI <shuhei @ aqua.ocn.ne.jp> wrote:
> 中身は FLIM 1.14.2 + parameter value decoder ですが,
> flim-1_13-rfc2231 とは異なる実装となっています.
"cvs rdiff -rflim-1_13 -rflim-1_13-rfc2231 flim" の出力によると,
flim-1_13-rfc2231 では以下の変更が行なわれているようです.
1. RFC 2231 とは無関係なもの.
a. 関数 mime-entity-root. (FLIM 1.14 での mime-find-root-entity)
b. eword-decode の structured-field 系 decoder が parse に失敗した
場合に unstructured-field として強制的に decode する.
2. encoded-word の RFC 2231 対応.
* encoded-word に language info が含まれていた場合, decode 結果の
`mime-language' text-property (symbol) とする.
3. parameter value の RFC 2231 対応.
* decode は lazy に行なう.
* language info は `mime-language' text-property (symbol) とする.
(mime-parse-Content-Type
"application/x-stuff;
title*0*=us-ascii'en'This%20is%20even%20more%20;
title*1*=%2A%2A%2Afun%2A%2A%2A%20;
title*2=\"isn't it!\"")
=> ((type . application) (subtype . x-stuff)
("title" . [en us-ascii ((0 t . "This%20is%20even%20more%20")
(1 t . "%2A%2A%2Afun%2A%2A%2A%20")
(2 nil . "isn't it!"))
nil]))
(mime-content-type-parameter
(mime-parse-Content-Type
"application/x-stuff;
title*0*=us-ascii'en'This%20is%20even%20more%20;
title*1*=%2A%2A%2Afun%2A%2A%2A%20;
title*2=\"isn't it!\"")
"title")
=> #("This is even more %2A%2A%2Afun%2A%2A%2A isn't it!" ; XXX
0 49 (mime-language en))
flim-1_14-rfc2231 では 2. と 3. の対応を行なっています.
ただし 3. は, 「そんなの lazy に decode することないじゃん」という判断
から eager に decode を行ないます.
(mime-parse-Content-Type
"application/x-stuff;
title*0*=us-ascii'en'This%20is%20even%20more%20;
title*1*=%2A%2A%2Afun%2A%2A%2A%20;
title*2=\"isn't it!\"")
=> ((type . application) (subtype . x-stuff)
("title" . #("This is even more ***fun*** isn't it!"
0 37 (mime-language en))))
このため flim-1_13-rfc2231 とは異なり, API の拡張[*]は不要になっています.
--
Shuhei KOBAYASHI
-------------- next part --------------
(benchmark 100 ...) を 16 回計測した結果の平均値の相対値.
1. 通常の plain text の Content-Type.
(mime-content-type-parameter
(mime-parse-Content-Type "text/plain; charset=\"iso-2022-jp\"")
"charset")
1.1. gc-cons-threshold を事実上無限大にした場合.
FLIM 1.14 vanilla: 1.00
FLIM 1.13 rfc2231: 3.15
FLIM 1.14 rfc2231: 3.90
1.2 gc-cons-threshold を 400000 (19.29 以降の初期値)にした場合.
FLIM 1.14 vanilla: 1.00
FLIM 1.13 rfc2231: 2.68
FLIM 1.14 rfc2231: 3.25
1.3 gc-cons-threshold を 100000 (19.28 までの初期値)にした場合.
FLIM 1.14 vanilla: 1.00
FLIM 1.13 rfc2231: 1.79
FLIM 1.14 rfc2231: 1.60
2. parameter の数が多い場合. (gc-cons-threshold は 400000)
(mime-parse-Content-Type "Message/External-body;
name=\"rfc2822.txt\";
site=\"ftp.isi.edu\";
access-type=\"anon-ftp\";
directory=\"in-notes\"")
FLIM 1.14 vanilla: 1.00
FLIM 1.13 rfc2231: 2.25
FLIM 1.14 rfc2231: 1.82
3. RFC 2231 の parameter value の decode. (gc-cons-threshold は 400000)
(mime-content-type-parameter
(mime-parse-Content-Type
"application/x-stuff;
title*0*=us-ascii'en'This%20is%20even%20more%20;
title*1*=%2A%2A%2Afun%2A%2A%2A%20;
title*2=\"isn't it!\"")
"title")
FLIM 1.14 vanilla: ----
FLIM 1.13 rfc2231: 1.00
FLIM 1.14 rfc2231: 1.34
結論:
1 回の処理は flim-1_13-rfc2231 の方が高速だが, resource の消費量が多いと
思われ, 実際の使用においては flim-1_14-rfc2231 の方が処理時間が少なくなる
と思われる. 実際, 数百通の mail を読む場合を ELP で測定すると flim-1_14-
rfc2231 の方が速い*こともある*.
;; 測定結果のバラツキが大きくて ELP による比較を諦めたというのが真相(^^;
decoder は使用頻度が低いと思われるので, この速度差は許容範囲と考える.
備考:
vanilla FLIM 1.14 の mime-parse-Content-Type では media-type, parameter
list 共に正規表現による pattern match で取り出している.
flim-1_13-rfc2231 では media-type には正規表現による pattern match を使用
するが, parameter list の方は lexical-analyze & parse を行なっている.
flim-1_14-rfc2231 では field-body 全体を lexical-analyze & parse している.
よって, flim-1_14-rfc2231 以外では, 変な位置に comment が入ると誤動作する.
;; でも, "Content-Type: (type) text / (subtype) plain" みたいなのが実際に
;; 使われるかは疑問なので, ほとんど問題にはならないはず.
More information about the Emacs-mime-ja
mailing list