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