1

これは私が説明できなかった非常に奇妙なことですが、おそらくあなたの何人かはすでに同じまたは同様の問題を見つけましたか?

次の疑似 PHP コードを想像してください。

<?PHP

  mysql_connect("localhost", "mysql_user", "mysql_password");
  mysql_select_db("mydb");
  $result = mysql_query("SELECT id, my_name FROM my_table");

  while ($row = mysql_fetch_array($result, MYSQL_NUM)) {

      $row[1] ? echo $row[1] : echo $row[0];

  } 

  mysql_free_result($result);

?>

これは基本的に、mySQL サーバーにクエリを実行し、すべてのレコードセットを反復処理するだけです。次に、「省略形」の if ステートメントを使用して、 column に何かがあるかどうかを調べますmy_name。ある場合はそれを印刷し、ない場合はid代わりに を印刷します。

if{}else{}ここで奇妙な点は、ESX5 で実行されている Debian Linux 仮想マシンで、この略記 if に通常のステートメントよりも 10 倍の時間がかかることです。

したがって、私の場合は 3 秒 (5000 レコードの反復) でしたが、この特定の VM では 30 秒かかりました。ESX4 Debian ホストで同じコードが問題なく実行されています。

省略形の IF を通常の IF ステートメントに置き換えれば、すべて問題ありません。

インターネットでいろいろ調べましたが、説明がわかりませんでした。問題の検索はどこから始めますか?

ありがとうございました!// マーカス

4

2 に答える 2

1

さて、私のせいです-三項演算子を「頭から」使用する前に、三項演算子のマニュアルを読むべきでした...

コメントで言及されている非環式タウMTilstedとして、演算子を正しい形式に変更しまし た。

$output .= ($row[1] ? $row[1] : $row[0]);

奇妙な速度の問題は解消されましたが、次の疑問は、間違った構文のために PHP が例外をスローしない理由です。

于 2013-11-05T16:25:46.450 に答える
0

三項演算子 (?) と IF ステートメントの間には根本的な違いがあると思います (ここで説明されているようにhttp://fabien.potencier.org/article/48/the-php-ternary-operator-fast-or-not )合計は基本的に次のとおりです。

三項演算子の速度は、厳密には必要でない場合でも、ステートメントの結果をコピーするのにかかる時間に直接関係しています。また、100000 要素の配列をコピーするには時間がかかります。

これは、三項演算子が値を新しいメモリ位置にコピーするという事実によるものですが、if..else ブロックはそうではない可能性があります。

これは VM の単一インスタンスでの速度の違いを説明するかもしれませんが、2 つの VM の両方が三項演算子を使用している場合に速度が異なる理由を十分に説明することはできません。使用している 2 つの VM が異なるハードウェア上にあると仮定します。異なるバージョンの PHP を使用している可能性はありますか? 基になるプロセッサが 2 つのホスト間で異なり、メモリ コピーの処理速度に影響を与えていますか?

于 2013-11-05T14:18:56.530 に答える