1

PHPで数値を生成し、たとえばその数値が100未満であるかどうかを確認して0.1ポイントを与えるのに助けが必要です。これは、フラッシュ ゲームで特定のアクションが使用されたときに呼び出されるコイン システム用です。

これを可能な限り最速で実行したいので、ゲームのメインサーバーに更新する前にテストするために使用しているコードを次に示します。

<?php
$coins = 0;
$rand = rand(0, 1000);

if($rand < 50){
$coins = $coins + 0.01;
}

if($rand < 100 && $rand > 50){
$coins = $coins + 0.2;
}

if($rand > 100 && $rand < 200){
$coins = $coins + 0.2;
}

if($rand > 500){
$coins = $coins + 0.5;
}

echo "Generated $coins coins \n";
?>

誰かが私のクエストを一言で理解していない場合は申し訳ありませんが、どうすればこれをより速くできるかを尋ねています。

4

3 に答える 3

2

を使用する代わりに、 を使用することrand()を検討してmt_rand()ください。ドキュメントから:

古い libcs​​ の多くの乱数ジェネレーターは、疑わしいまたは未知の特性を持ち、低速です。デフォルトでは、PHP は libc 乱数ジェネレーターと rand() 関数を使用します。mt_rand() 関数は、これを簡単に置き換えるものです。» Mersenne Twister を使用して既知の特性を持つ乱数ジェネレーターを使用します。これは、平均的な libc rand() が提供するよりも 4 倍高速に乱数を生成します。

また、同じトピックについて議論している非常によく似たスレッドがもう 1 つあります:ランダムな php 番号を取得する最速の方法は?

ただし、ここでどのような最適化を求めているのかわかりません。その議論からのフランク・ファーマーのコメントを繰り返したいと思います。

なぜこの特定の操作の速度をそんなに気にするのですか? プロファイリングしましたか?どちらかを選択することで、どのくらいの時間を節約できると思いますか? ...もっと率直に言ってみましょう。意味のある違いはありません。私たちは、ナノ秒単位で測定された違いについて話している

于 2012-11-01T18:14:27.557 に答える
2

最初に行うことは、毎回すべてのテストを実行しないように else を使用することです。つまり、これを行う場合:

if (condition1) ...
if (condition2) ...
if (condition3) ...

次に、PHP は毎回各条件のチェックを実行する必要があります。condition1 が condition2 を除外することがわかっている場合は、次のようにします。

if (condition1) ...
elseif (condition2) ...
elseif (condition3) ...

このようにして、実際に一致するポイントまで条件を実行するだけです。次のステップは、成功する可能性が最も高い条件を最初に置くことです。

if ($rand > 500) ...
elseif ($rand > 100 && $rand < 200) ...

この方法では、半分の時間で、チェックを 1 回だけ行うことになります。

于 2012-11-01T18:15:16.090 に答える
0

>両方をチェックする必要はなく<、次のように比較を連鎖させる場合:

<?php
$coins = 0;
$rand = rand(0, 1000);

if( $rand > 500 ) {
    $coins += 0.5;
} else if( $rand > 200 ) {
    $coins += 0.4;
} else if( $rand > 100 ) {
    $coins += 0.3;
} else if( $rand > 50 ) {
    $coins += 0.2;
} else {
    $coins += 0.1;
}

echo "Generated $coins coins \n";

これをループしたり、元のコードを毎秒何百万回もループしたりしない限り、私は心配しません。

ただし、Flash ゲームで何かが発生するたびに HTTP 経由でこのスクリプトを呼び出すためのオーバーヘッドが心配です。そのオーバーヘッドがゲームのパフォーマンスを低下させ、サーバーに負荷をかけます。

于 2012-11-01T18:21:56.020 に答える