http://www.securityandcaffeine.com/2008/04/03/php-mysql-and-mysql_fetch_array/
上記の記事は私を驚かせました。それは言います:
mysql_fetch_array()
- "1 – 引用符を使用してください! 1/7 の時間で$result['2']
比較できます$result[2]
"
それが本当かどうか、何か考えはありますか?
http://www.securityandcaffeine.com/2008/04/03/php-mysql-and-mysql_fetch_array/
上記の記事は私を驚かせました。それは言います:
mysql_fetch_array()
- "1 – 引用符を使用してください! 1/7 の時間で$result['2']
比較できます$result[2]
"
それが本当かどうか、何か考えはありますか?
これは完全に誤解に基づいているようです。この引用を見て、私のものを強調してください:
1 – 値を参照すると速度が無駄になりますが、引用符は使用しません。Reinhold Weber のブログ: #17: “<code>$row['id'] は
$row[id]
“. あなたがこれを頻繁に、そして頻繁にやっているなら… ああ。
はい、$row['id']
は よりも高速です$row[id]
。これ$row[id]
は、定数を解決しようとする構文エラーであり、それを文字列に変換し、同時に通知をスローするためです。しかし$row[1]
、$row['id']
両方とも有効であり、非常に同じように機能するはずです。数値インデックスの検索と文字列インデックスの検索に違いがある場合、時間の価値がないほど最小限に抑える必要があります。
PHP 配列が実際には位置キーを持っていないが、すべて連想的であるという啓示は... 実際にはニュースではありません。これにより、広範囲に及ぶ速度の問題はありません。実際、この簡単なベンチマークは、「数値文字列」インデックスがすべてのインデックスの中で最も遅いルックアップであることを示しています: http://codepad.org/aeNJ2u3O
とにかく、mysql_fetch_assoc
orを使用する必要がmysql_fetch_row
あります。これは、それぞれ名前付き (文字列インデックス) または名前なし (数値インデックス) 配列を取得します。両方を取得するを使用_fetch_array
することは、通常は不要です。
実際のパフォーマンス データが必要な場合は、ユース ケースのベンチマークを行います。
この引用に基づく:
$result[2]と比較して$result['2']を取得する時間の1/7。
特に、他の人の(存在しない)ブログへの記事のリンクを参照として考えると、これが正当な理由なしに正確であるとは非常に疑わしいです。
なんで?内部的には、 PHPは配列にハッシュテーブルを使用しているためです。Kendall Hopkinsの回答は、実装を説明するのに最適です。
PHP配列は、intキーとstringキーを可能にするチェーンハッシュテーブル(キーの衝突でのO(c)とO(n)のルックアップ)です。2つの異なるハッシュアルゴリズムを使用して、2つのタイプを同じハッシュキースペースに適合させます。また、ハッシュに格納されている各値は、その前に格納されている値と後に格納されている値にリンクされています(リンクリスト)。また、ハッシュを繰り返すことができるように、現在のアイテムを保持するために使用される一時的なポインターもあります。
したがって、intキーとstringキーの2つの別々のハッシュアルゴリズムが7倍のパフォーマンスギャップに悩まされていることを証明するベンチマークがない限り、この記事は意味がありません。
やれやれ... PHP は本当に悲惨な言語です。
MySQL の結果を結合された連想/通常配列として取得すると、実際に得られるのは連想配列であり、キーの一部は数値インデックスです。
したがって、すべてのルックアップはキー ルックアップです。
との違いは、最初に PHP が整数を string$result[2]
に変換して、ルックアップのキーとして使用できるようにする必要があることです。$result["2"]
2
"2"
変換にルックアップの 6 倍の長さがかかるかどうかはわかりません。私はベンチマークを行っていません。しかし、それがより長いという事実は確かにもっともらしいです。それが本当かどうか?これらの主張を裏付ける責任は、記事の元の著者にあります。