私設SoS2オーナー応援BBS

新規発言一覧最新記事過去一覧検索ダウンロードページHOME

No.342  Re:SoSというよりPerlの事かな?
発言者: moon
発言日: 2003 02/10 09:07
> またもやおじゃまします(^^;
> 月さんの以前のレスの中に、
> 「if($pav eq 'dead' && index($psp,'Re')>=0) の様にindexで検索することで//を使うより負荷軽減 」
> というものがありました。
>
> index自体の意味は調べてわかったのですが、負荷軽減の度合とはどうやって調べるものなのか?という疑問がありまして。
> 比べてみた時にAよりもBの方が良い、となればできるだけ置き換えてみたいとも思いますし。
> 簡単に調べられるものなのかどうか?という点と、もし手軽に調べられないものであれば、上記の例の他に有効的な物があるかどうか?という2つを質問したいのですが、ちょっと具体的な質問でなくてすいません。
>
> 「SoSのソース中で」よく使われている物だと、@@@な部分はこうした方がより良い(軽減等につながる)、というような1例などでも構いません。
> アドバイスやヒントになるものを教えていただけないでしょうか?
> よろしくおねがいします。

調べ方は、Perlで実際に動かして時間を測ってみることです。(笑)
例えば、
・perl -we "$a=time; foreach(1..10000000){/abc/} print time-$a,qq|\n|;"
・perl -we "$a=time; foreach(1..10000000){index(qq|abc|,$_)} print time-$a,qq|\n|;"
を比べると時間に差が出ていることが分かります。(速いCPUだともっとループ回数を増やさないと差が分からないかもしれません)
逆にいうとこれだけのループがないと差がでないのでそんなに負荷の差がないとも言えます。(これを重要と見るかどうかです。)
また、置き換える場合も正規表現が必要な場合は//を使用してそれ以外はindexに変更するという選り分けが必要となります。

負荷軽減のアドバイスですか・・・。
それでは一例を。
メイン処理の分岐、
  if($Fm{'mode'} eq '〜'){〜}
  if($Fm{'mode'} eq '〜'){〜}
  if($Fm{'mode'} eq '〜'){〜}
  # 〜
を、
  if($Fm{'mode'} eq '〜'){〜}
  elsif($Fm{'mode'} eq '〜'){〜}
  elsif($Fm{'mode'} eq '〜'){〜}
  # 〜
  else{&error('無効なモードです');}
とelsifを使用して全体的な判定回数を減らす、というのがあります。
この注意点として、デフォルトではlistが2つあるのでそれを順番を変えずに1つにまとめないといけません。

▼関連発言

341:SoSというよりPerlの事かな? [なず] 02/10 00:54
 └342:Re:SoSというよりPerlの事かな? [moon] 02/10 09:07
  └345:Re[2]:SoSというよりPerlの事かな? [なず] 02/11 04:09
   └346:Re[3]:SoSというよりPerlの事かな? [moon] 02/11 11:57
    └347:Re[4]:SoSというよりPerlの事かな? [なず] 02/11 23:53
     └348:Re[5]:SoSというよりPerlの事かな? [moon] 02/12 00:45
      └349:Re[6]:SoSというよりPerlの事かな? [なず] 02/12 23:58
       └350:Re[7]:SoSというよりPerlの事かな? [moon] 02/13 00:41
        └351:Re[8]:SoSというよりPerlの事かな? [なず] 02/13 05:51<-last

Pass 保存


CGIROOM