0

わかった。そのため、スクリプトの実行に時間がかかる理由を突き止めようと、頭を悩ませていました。潜在的な原因を突き止めたので、次の機能を実行するより効率的な方法を見つけたいと思います。

function getwrs($obj, $recs) {
    foreach ($obj as $key => $val) {
        for ($i=0; $i<count($recs); $i++) {
            $wr = array();
            if ($recs[$i][0] === $key) {
                $wr = $recs[$i];
                break;
            }
        }
        if (count($wr) > 0) {
            for ($i=0; $i<count($val); $i++) {
                if ($val[$i]["time"] < $wr[1] && abs($wr[1] - $val[$i]["time"]) < 30) {
                    $uwrs[] = array($val[$i], $wr);
                }
            }
        }
    }
    return $uwrs;
}

私はこの関数を次のように呼び出しています:

$wrs = getwrs($top15["pro"], $recs);

ここ$top15["pro"]で、次の構造を持つ多次元配列です。

[MAP1NAME] => Array
(
    [0] => Array
    (
        [authid] => XXXX
        [name] => XXXX
        [time] => XXXX
        [date] => XXXX
        ...
    )
)
[MAP2NAME] => Array
(
    [0] => Array
    (
        [authid] => XXXX
        [name] => XXXX
        [time] => XXXX
        [date] => XXXX
        ...
    )
    [1] => Array
    (
        [authid] => XXXX
        [name] => XXXX
        [time] => XXXX
        [date] => XXXX
        ...
    )
    ...
)

$recs は、同等の値と次の構造を持つ約 3000 のエントリを含む配列です。

[0] => Array
    (
        [0] => MAP1NAME
        [1] => TIMEVAL
        [2] => USERNAME1
        [3] => COUNTRY
    )
    ...

この関数の目的は、データベース内の各マップの時間値 ( $top15) と公式の世界記録配列 ( $recs) の時間値を比較して、非公式の世界記録を見つけることです。

現在、データベースから各マップ名を取得し、公式の世界記録の配列から同じ文字列を見つけて、公式の$wr記録がある場合は、マップの公式の世界記録の値を変数に格納しています。次に、データベースの完了時間の配列をループして、公式記録時間よりも短い時間を見つけます。これが当てはまるたびに、データベース時間と公式の記録時間 (ユーザー、時間など) に関する情報の両方を新しい配列にプッシュします。これは、データベースのすべてのキー (マップ名) に対して繰り返されます。最後に、関数は非公式の世界記録配列 ( $uwrs) を返します。

問題は単純です。これには、何らかの理由で非常に時間がかかります。私はもともとスクリプトを JavaScript でコーディングしましたが、非常に反応が良かったので、ここで何か間違ったことをしていると思っているのかもしれません。何か助けはありますか?

編集: xdebug を使用して問題を特定しました。この関数の呼び出しを追加すると、出力ファイルが 3MB から 30MB 以上になり、スクリプトの実行時間が約 1 秒から 15 ~ 20 秒になります。私はこのツールに比較的慣れていないため、この情報が重要かどうかはわかりません。

編集 2: 要求に応じて、データベースの構造は次のとおりです。

map | authid | name | time | date | weapon

元:

kzbr_brickngrasshop | STEAM_0:1:XXXXXXX | John Travolta kz-endo | 23.582824 | 2013-08-25 | 03:40:17 | knife
4

2 に答える 2

0

ループを実行する前に、13,000,000 の異なる変数を作成し、各配列の長さに設定することで問題を解決しました。読んでみると、1500/3000などまで数えていたことがわかりました。forループを使用するたびに。PHPのパフォーマンスに影響すると思います..

于 2013-09-13T17:49:31.743 に答える