0

これが重複しているとは思いません。探しましたが、正確に何と呼ぶべきかまったくわかりませんでした。

別のループの 10 倍のループの実行に 10 倍の時間がかからない理由を知りたいです。

私は自分のウェブサイトをより速く、より反応的にする方法を見つけるためにいくつかのテストを行っていたので、microtime()前と後の関数を使用していました. 私の Web サイトでは、テーブル全体を調べずに、特定の属性を持つテーブル行のリストを引き出す方法がわかりません。これが原因で速度が低下しているかどうかを知りたかったのです。

したがって、次のループを使用します。

echo microtime(), "<br>";
echo microtime(), "<br>";
session_start();
$connection = mysqli_connect("localhost", "root", "", "") or die(mysqli_connection_error());; 
echo microtime(), "<br>";
echo microtime(), "<br>";
$x=1000;
$messagequery = mysqli_query($connection, "SELECT * FROM users WHERE ID='$x'");
while(!$messagequery or mysqli_num_rows($messagequery) == 0) {
    echo('a');
    $x--;
    $messagequery = mysqli_query($connection, "SELECT * FROM users WHERE ID='$x'");
    }
echo "<br>";
echo microtime(), "<br>";
echo microtime(), "<br>";

次の出力と同様の出力が得られました。

0.14463300 1376367329
0.14464400 1376367329
0.15548900 1376367330
0.15550000 1376367330 < these two
[a's omitted, for readability]
0.33229800 1376367330 < these two
0.33230700 1376367330

〜18〜20マイクロ秒、それほど悪くはありません。誰もそれに気づきません。それで、私のウェブサイトが成長するとどうなるのだろうと思いました。検索するテーブル行が 10 倍 (10,000) あるとどうなるでしょうか?

0.11086600 1376367692
0.11087600 1376367692
0.11582100 1376367693
0.11583600 1376367693
[lots of a's]
0.96294500 1376367694
0.96295500 1376367694

~83-88 マイクロ秒。180 ~ 200 マイクロ秒ではないのはなぜですか? ループの開始と停止に時間がかかるかどうかなど。

更新:変数を追加するのがmySQLであるかどうかを確認するために、mySQLなしでテストしました:

echo microtime(), "<br>";
echo microtime(), "<br>";
session_start();
$connection = mysqli_connect("localhost", "root", "W2072a", "triiline1") or die(mysqli_connection_error());; 
echo microtime(), "<br>";
echo microtime(), "<br>";
$x=1000000;
while($x > 10) {
    echo('a');
    $x--;
    }
echo "<br>";
echo microtime(), "<br>";
echo microtime(), "<br>";

現在、100 万で約 100 ミリ秒かかり (右?)、1000 万で約 480 ミリ秒かかるようです。だから、私の質問はまだ残っています。ループが大きいほど速く動くのはなぜですか? 重要ではありません。これに基づいてウェブサイト全体のデザインを計画しているわけではありませんが、興味があります。

4

2 に答える 2

1

通常、ループは直線的にスケーリングします。

考えられるバグ: まだ行っていない場合は、ID 900 のレコードがない場合に何が起こるかを考えてください。

この方法で情報をソートするのではなく、MySQL を使用して WHERE 句を介してフィルタリング作業を行うことを強くお勧めします。それは実際にはスケーラブルではありません。

はっきり言ってライン

while(!$messagequery または mysqli_num_rows($messagequery) == 0) {

私には意味がありません。 失敗が発生した場合は false になり、ゼロに等しくない$messagequery限りループを実行したいと思います。mysqli_num_rows($messagequery)ただし、上記のコードはそうではありません。

mysqli_num_rows($messagequery)がゼロに等しい 場合、ループは続行されます。

mysqli_num_rows($messagequery)がゼロに等しくない場合、ループは停止します 。

演算子の優先順位を参照してください: http://php.net/manual/en/language.operators.precedence.php

それはあなたの質問に答えるのに役立ちますか?

于 2013-08-13T04:49:17.497 に答える