[#35688] サブクラスのオブジェクト生成時に、スーパークラスの初期化を行うには ? — Onodera Takafumi <onodera-tak@...>

9 messages 2002/08/01

[#35772] Unsecure world writeable dirの警告 — "井上 浩一" <kyoui32@...>

井上です。

31 messages 2002/08/26
[#35774] Re: Unsecure world writeable dir の警告 — matz@... (Yukihiro Matsumoto) 2002/08/26

まつもと ゆきひろです

[#35775] Re: Unsecure world writeabledir の警告 — nobu.nakada@... 2002/08/26

なかだです。

[#35776] Re: Unsecure world writeabledir の警告 — matz@... (Yukihiro Matsumoto) 2002/08/26

まつもと ゆきひろです

[#35778] Re: Unsecure world writeabledir の警告 — nobu.nakada@... 2002/08/26

なかだです。

[#35779] Re: Unsecure world writeabledir の警告 — WATANABE Hirofumi <eban@...> 2002/08/26

わたなべです。

[#35780] Re: Unsecure world writeabledir の警告 — nobu.nakada@... 2002/08/26

なかだです。

[#35784] Re: Unsecure world writeabledir の警告 — "U.Nakamura" <usa@...> 2002/08/26

こんにちは、なかむら(う)です。

[#35854] Re: Unsecure world writeabledir の警告 — "Inoue" <rubyist@...1.117.ne.jp> 2002/09/04

井上です。

[#35865] Re: Unsecure world writeabledir の警告 — Koji Arai <JCA02266@...> 2002/09/05

新井です。

[#35866] Re: Unsecure world writeabledir の警告 — matz@... (Yukihiro Matsumoto) 2002/09/06

まつもと ゆきひろです

[#35789] multipart な CGI を速くしたい — Takashi Kanai <kanai@...4u.or.jp>

Windows上でRubyとMySQLを使ってショッピングサイトのようなものを作って

17 messages 2002/08/28

[ruby-list:35812] Re: multipart な CGI を速くしたい

From: Takashi Kanai <kanai@...4u.or.jp>
Date: 2002-08-29 04:01:05 UTC
List: ruby-list #35812
こんにちは、金井です。

MoonWolf <moonwolf@moonwolf.com> wrote:
> C言語版にこだわらなければ、PureRuby版のStringIOでもいいと思います。

ありがとうございます。さっそく試してみました。

FORM中には次の<INPUT>があります。合計 210個です。
 HIDDEN:2 SUBMIT:2 TEXT:41 CHECKBOX:134 SELECT:29 FILE:2
2つのFILEは 6番目,210番目(すなわち最後)にあります。
FILE以外には若干の入力があり、CONTENT_LENGTH は 20942 です。
FILEとしては約54.5KBのJPGを使いました。
表の中の時間の単位は ms です。
計測のたびにread_multipart時間にして200ms程度のばらつきがありました。

                         read_multipart  Tempfile.new  StrionIO.new
   StringIO  FILE1 FILE2           時間  時間/回数     時間/回数
-------------------------------------------------------------------
1-1   ×      ×   ×              7531  7046/210         0/  0
1-2   ×      ○   ×              7515  7062/210         0/  0
1-3   ×      ×   ○              7547  6938/210         0/  0
-------------------------------------------------------------------
2-1   ○      ×   ×              2860  2438/103       141/107
2-2   ○      ○   ×              1703  1249/ 56        78/154
2-3   ○      ×   ○              7391  6964/210         0/  0
-------------------------------------------------------------------
3-1   ○      ×   ×               360     0/  0        32/210
3-2   ○      ○   ×               610   141/  6        62/204
3-3   ○      ×   ○              7469  7001/210         0/  0
-------------------------------------------------------------------

2-1を例に読み方を説明します。
 stringio.rbが存在する。
 2つの<INPUT type="file">のうちの最初のものにだけファイルを指定。
 read_multipart関数の所要時間が2860ms。
 その中でTempfile.newが103回あり、その合計所要時間が2438ms。
 StringIO.newが107回あり、その合計所用時間が141ms。

さて、
表の最初の3行は StringIO 無しの場合です。
FILEが 両方空白/最初のだけ指定/最後のだけ指定 した場合の3通りです。
read_multipartの所要時間のほとんどが 210回の Tempfile.new に費や 
されているのが分かります。平均するとだいたい 33ms くらいでしょうか。

次の3行は StringIO 有りの場合です。劇的に速くなっています。
ただ2-3から分かるように、最後の最後にFILEがある場合はStringIOの
御利益が無くなってしまいます。

最後の3行は、Tempfileを使うかStringIOを使うかの判定をしている
 if 10240 < content_length
という行を、試しに
 if 10240*3 < content_length
に変えてみた場合です。
3-1を見れば分かりますが、CONTENT_LENGTHは20942ですので、Tempfile.new
は結局1回も実行されません。

以上のように、FILEをFORMの後ろの方に置きさえしなければStringIOの効果は
絶大です。この制約もread_multipart関数に手を入れれば解消できるような
気がしますが、今の私の手には余りますので cgi.rb はそのままで stringio
を入れるだけで運用しようと思います。

どうもありがとうございました。


MoonWolf <moonwolf@moonwolf.com> wrote:
> この程度のFORMで遅くなるのはcgi.rbにも原因があります。
> read_multipart中の以下の部分は無駄が多いです。
> 
> >           begin
> >             require "stringio" if not defined? StringIO
> >             body = StringIO.new
> >           rescue LoadError
> >             require "tempfile"
> >             body = Tempfile.new("CGI")
> >           end
> メソッド実行時ではなく、ライブラリロード時に解決すべき問題です。

 律速段階は Tempfile.new であることが分かりましたので、処理時間に関し
ては、あまり効果がないのではないかと思います。

--
金井 隆 (KANAI Takashi)
kanai@nn.iij4u.or.jp


In This Thread