▼スレッド
│
└◇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
> またもやおじゃまします(^^;スレッド一覧
> 月さんの以前のレスの中に、
> 「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つにまとめないといけません。
> 調べ方は、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つにまとめないといけません。
これは一部だけをelsifにしてもかわってくるもんでしょうか?
例えば、そのうちのいくつか(探索場所を増やしているのでそういったまず「一度にどれか」しか使わない類)をelsifにしたりして、自信のないところはそのままというかw
if($Fm{'mode'} eq '〜'){〜} と20こ並んでいたとして、そのうちの半数を修正してやるだけでもやはり軽減につながるものなのかなぁ?と。
数が多ければその分処理軽減につながる、とみていいんでしょうか?
リスト部分を2つ順番に1つにする、というのがちょっとパっとできなさそうでして(^^;
無理ない程度で少しずつelsif化していく、って形が私には実現可能な範囲かと思ったもので。
> これは一部だけをelsifにしてもかわってくるもんでしょうか?スレッド一覧
> 例えば、そのうちのいくつか(探索場所を増やしているのでそういったまず「一度にどれか」しか使わない類)をelsifにしたりして、自信のないところはそのままというかw
> if($Fm{'mode'} eq '〜'){〜} と20こ並んでいたとして、そのうちの半数を修正してやるだけでもやはり軽減につながるものなのかなぁ?と。
> 数が多ければその分処理軽減につながる、とみていいんでしょうか?
>
> リスト部分を2つ順番に1つにする、というのがちょっとパっとできなさそうでして(^^;
> 無理ない程度で少しずつelsif化していく、って形が私には実現可能な範囲かと思ったもので。
元がifなので部分的にelsifにしても通常は問題ないはずですよ。(分岐処理でデフォルト処理の流れとかけ離れたことをやっていなければですが)
ちなみに、リスト云々は&list_order;とplayer_list;が違うif文で実行されているところを1つ(elsif($Fm{'mode'} eq 'list'){&list_order; player_list;})にするだけです。
あと、これは単純に判断回数を減らそうというわけなのでよく実行されるmodeが後のほうのelsifにあると効果が薄くなります。(部分的にelsifにした場合は100%の確率で判断されるif文が残ったままということになるのでその分効率が落ちます。)
各modeの実行回数がほぼ一様だと考えるとこのことは無視できますが、少しは念頭に置いておくと良いかもしれません。
> 元がifなので部分的にelsifにしても通常は問題ないはずですよ。(分岐処理でデフォルト処理の流れとかけ離れたことをやっていなければですが)スレッド一覧
> ちなみに、リスト云々は&list_order;とplayer_list;が違うif文で実行されているところを1つ(elsif($Fm{'mode'} eq 'list'){&list_order; player_list;})にするだけです。
>
> あと、これは単純に判断回数を減らそうというわけなのでよく実行されるmodeが後のほうのelsifにあると効果が薄くなります。(部分的にelsifにした場合は100%の確率で判断されるif文が残ったままということになるのでその分効率が落ちます。)
> 各modeの実行回数がほぼ一様だと考えるとこのことは無視できますが、少しは念頭に置いておくと良いかもしれません。
リストの解説どうもです(^0^)
(もっと複雑な事をするのかと思いましたw)
ここを含めて一通りのifを問題ない程度elsif化してくつもりです。
modeの場所は「回数が多そうな順」で並べていくとそれなりの効果がある、と解釈しましたが、良かったですか?(^^;
他にこの様な負荷軽減策があればまた教えてほしいところですが、そういった工夫は他にありますか?
(色々方法はあると思う&環境や改造等でいちがいにできるものじゃないのでしょうけど、少しでも良い状態にしつつ中味の勉強になればと思っているもので^^;)
> リストの解説どうもです(^0^)スレッド一覧
> (もっと複雑な事をするのかと思いましたw)
> ここを含めて一通りのifを問題ない程度elsif化してくつもりです。
> modeの場所は「回数が多そうな順」で並べていくとそれなりの効果がある、と解釈しましたが、良かったですか?(^^;
それなりの効果があるかはわかりませんが、効果的な並び順という意味ではその通りです。
> 他にこの様な負荷軽減策があればまた教えてほしいところですが、そういった工夫は他にありますか?
> (色々方法はあると思う&環境や改造等でいちがいにできるものじゃないのでしょうけど、少しでも良い状態にしつつ中味の勉強になればと思っているもので^^;)
少し前に本家BBSで「メッセージを残した後に自動的に別れる」というのが話題に上がっていましたがこれも全体的な実行回数を減らすという意味で効果があると思います。(自分は以前からこうしており誤解を受けたくなかったので話題に参加しませんでしたが(笑))
ちなみに、これに加えてうちでは買い物の前に商品一覧とは別に残すメッセージの欄を表示して、さらに別れるか別れないかの選択を出来るようにしていたりします。
他には、SoS2の一番の負荷ともいえるユーザファイルの一括処理(トップ画面表示、行動画面表示、リスト表示)をどうにかすることです。
ただし、利便性に大幅に絡んでくるのである意味最終手段です。
これに関してうちで改造しているのは、行動画面のプレイヤーのプルダウンを表示するかしないかをユーザが選択できるようにしています。(もちろんリストが無くても人を探しやすいように省略IDでもOKにし、名前でもOKにしてあります。)
> 少し前に本家BBSで「メッセージを残した後に自動的に別れる」というのが話題に上がっていましたがこれも全体的な実行回数を減らすという意味で効果があると思います。(自分は以前からこうしており誤解を受けたくなかったので話題に参加しませんでしたが(笑))スレッド一覧
> ちなみに、これに加えてうちでは買い物の前に商品一覧とは別に残すメッセージの欄を表示して、さらに別れるか別れないかの選択を出来るようにしていたりします。
本家の方、これは私も読んでいました。
やはり「実行回数の減少」を優先するべきですよね。
同時にメッセージ欄の表示、ですかぁ。
確かにそうあれば何度も「決定」しないでよいのと、すでに欄があれば手紙を残す機会も増えそうで実用的ですね。
これは改良の価値がありそうです(^0^)b
> 他には、SoS2の一番の負荷ともいえるユーザファイルの一括処理(トップ画面表示、行動画面表示、リスト表示)をどうにかすることです。
> ただし、利便性に大幅に絡んでくるのである意味最終手段です。
> これに関してうちで改造しているのは、行動画面のプレイヤーのプルダウンを表示するかしないかをユーザが選択できるようにしています。(もちろんリストが無くても人を探しやすいように省略IDでもOKにし、名前でもOKにしてあります。)
プルダウン表示の部分をカットするってことですかね?(プラス名前入力処理等)
あの部分は毎回すべてのキャラデータを読んでいるんでしょうね。(たまたま先日あの部分をいじっていた)
軽減できそうですがやはり大きく違うものなのでしょうか?(体感速度とまではいかなくとも早いのかな?)
大きく変わりそうならそういった処理もしてみたいです。
ただやはりプルダウンは楽でしょうから、悩みどころです
特にうちではテスト分しかキャラデータをおいてないので、多くのプレイヤーがいる状況では違うんでしょうけど。(あんまり多いとプルメニューが長くなるでしょうし、やはり状況でしょうか?)
TPOに合わせてってことでしょうけど、判断基準がなくてw
> プルダウン表示の部分をカットするってことですかね?(プラス名前入力処理等)スレッド一覧
そういうことです。
> あの部分は毎回すべてのキャラデータを読んでいるんでしょうね。(たまたま先日あの部分をいじっていた)
> 軽減できそうですがやはり大きく違うものなのでしょうか?(体感速度とまではいかなくとも早いのかな?)
> 大きく変わりそうならそういった処理もしてみたいです。
> ただやはりプルダウンは楽でしょうから、悩みどころです
> 特にうちではテスト分しかキャラデータをおいてないので、多くのプレイヤーがいる状況では違うんでしょうけど。(あんまり多いとプルメニューが長くなるでしょうし、やはり状況でしょうか?)
> TPOに合わせてってことでしょうけど、判断基準がなくてw
人数が少ないと感じないとは思いますが、人数が多くてしかも回線速度が遅い環境の人だと差が体感できるほどに違いは出ると思いますよ。といっても100人級で56Kbps程度でも1秒の差は出ないとは思いますが。(でもそれがより合わさって体感できると。)
もちろん、ファイルアクセスはコンピュータのもっとも遅い処理の一つなのでそれを減らすことになり処理量的にもかなりの削減になります。
# 自分で一番体感速度の向上が感じられたのは、プルダウンを無くす、不必要な行動メニューを減らす、自分のキャラ画像を表示しない、自分のコメントを表示しない、などの全てを実行したときです。(うちでは表示をある程度オンオフできるようにしてあるので)
> 人数が少ないと感じないとは思いますが、人数が多くてしかも回線速度が遅い環境の人だと差が体感できるほどに違いは出ると思いますよ。といっても100人級で56Kbps程度でも1秒の差は出ないとは思いますが。(でもそれがより合わさって体感できると。)スレッド一覧
> もちろん、ファイルアクセスはコンピュータのもっとも遅い処理の一つなのでそれを減らすことになり処理量的にもかなりの削減になります。
塵もつもればってやつですねぇ....。
できるだけ実行回数を減らす努力ってのをしないとですね(^^)
念頭に置いて作業したいとおもいます。
> # 自分で一番体感速度の向上が感じられたのは、プルダウンを無くす、不必要な行動メニューを減らす、自分のキャラ画像を表示しない、自分のコメントを表示しない、などの全てを実行したときです。(うちでは表示をある程度オンオフできるようにしてあるので)
キャラ画像を削るのはやはり味気ないのですが、自分のコメントって確かに毎回表示させておく必要はなさそうですね。
この辺なども削ってみようかな。(画面もすっきりしそうだし)
不必要な行動メニューの減少をどうするか、かなり難しいです。
色々と改良をというか機能を付け加えたせいか、かなりコマンドが多くなってしまっている現状です。(^^;
増やす際にはかなり気を使っていても、機能が増えるとその分増えてしまうのは仕方ないことでしょうけど、その分細かい部分の処理を軽減させようという所から今回の一連の質問へ結び付いています。
前回までのelsif化等も一部では修正をいれたりしてみてます。
色々と他の部分でも不要な物や処理の向上を計るためにソースの見直しなども行っている状況です。
一度一通り見直して、また問題が出た時はおじゃまさせて貰おうとおもいます。
一連の回答等ありがとうございました。
定期的にお邪魔させて頂いていますので、また違うテクニック?等ありましたらご助力お願いします。m(、、)m