21

私は質問があります、より速いものは何ですか...

  1. すべてのデータを含む多くの変数を作成する、または
  2. すべてのデータを含む 1 つの変数に 1 つの配列を作成し、それにアクセスします
4

6 に答える 6

26

試してみてください:)

テスト 1

5つの変数で

$myvar1 = 'hello';
$myvar2 = 'hello';
$myvar3 = 'hello';
$myvar4 = 'hello';
$myvar4 = 'hello';

print_r(memory_get_usage());

結果:618600

テスト 2

配列キー5個付き

$myvar = array();
$myvar['var1'] = 'hello';
$myvar['var2'] = 'hello';
$myvar['var3'] = 'hello';
$myvar['var4'] = 'hello';
$myvar['var5'] = 'hello';

print_r(memory_get_usage());

結果:620256

于 2013-01-15T12:35:33.757 に答える
21

短い:変数へのアクセスが高速になります。

ただし、コードの品質が向上するため、配列を使用することもできます。パフォーマンスを向上させるには、キャッシュを使用します。とにかく、パフォーマンスの問題は発生したときにのみ処理する必要があります。

アレイテスト

$n = 1000000;
$startTime = microtime(true);  
for ($i = 0; $i <= $n; $i++)
{
    $x = $a[1];
}
$endTime = microtime(true);  
$elapsed = $endTime - $startTime;
echo "Array: $elapsed seconds";

可変テスト

$startTime = microtime(true);  

for ($i = 0; $i <= $n; $i++)
{
    $x = $v;
}
$endTime = microtime(true);  
$elapsed = $endTime - $startTime;
echo "Variable : $elapsed seconds";

結果

配列: 0.092 秒

変数 : 0.064 秒

また、インデックスとして文字列を持つ配列を使用するノードは、はるかに遅くなります (ハッシュマップ)。zend_hash_findzend_hash_index_findを比較してください。

$a = array_fill( 0, 1000, 1 );私が使用する場合、配列の大きさは実際には違いはありません$x = $a2[999];

メモリー

質問ではありませんが、興味深いのはメモリ使用量です。そこで、10000 個の要素と 10000 個の変数を持つ配列を作成しました。

$a = array();
for ($i = 0; $i <= 10000; $i++)
{
    // one array
    eval('$a[] = "test";'); // 3454128
    // Variables
    //eval('$a' . $i. ' = "test";'); // 3552360
}
print_r(memory_get_usage());

配列: 3454128

変数: 3552360

そのため、配列が使用するメモリはわずかに少なくなります。

于 2013-01-15T12:44:50.490 に答える
4

ここの人々は、配列の方が速いと言っています。しかし、配列も変数です。配列を使用する場合 - 変数と同様にアクセスする必要があり、さらに配列内の項目にアクセスする必要があります。したがって、変数のストレージのように使用される配列は最良のアイデアではないように思えます。

さらに、配列は一部の配列データを格納するために使用されます。たとえば、カテゴリ ID => カテゴリ名のペアのように。

$catId1 = "Category 1";
$catId2 = "Category 2";
$catId3 = "Category 3";

上記のようなコードは... 奇妙です。たとえば、forループ内のすべてのカテゴリを通過できないなど、配列の多くの機能が失われています。したがって、配列データの場合、配列が必要です。

さまざまな種類のデータを取得したら (整数や文字列などの型ではなく、そのデータの意味について話します)、変数をより適切に使用する必要があります。

$requested_category = 1;
$requested_category_name = "Some category";
$category_processing_result = "Ok"; 

配列の代わりに:

$varsArray['requested_category'] = 1;
$varsArray['requested_category_name'] = "Some category";
$varsArray['category_processing_result'] = "Ok"; 

変数を使用すると、IDE はそれらの名前を書くのに役立ちます。そのようなコードは読みやすく、サポートしやすくなります。そして、それは私にとってより重要です。

何らかの理由で遅くなったり、より多くのメモリを使用したりしても、速度/メモリ使用量の点で最悪の問題ではありません。

于 2013-01-15T12:44:31.410 に答える
3

多くの変数は、主に配列が順序付けられたマップ ( http://php.net/manual/en/language.types.array.php ) であるため、配列よりも高速です。配列内の値への参照キーも割り当てられます。これには余分なメモリが必要であり、配列内の数十万のレコードについて話すときに大きな影響を与える可能性があります。レコード数が増えるとパフォーマンスが低下します。このオーバーヘッドは、配列の代わりにスカラー変数を使用することで回避できます。

最近、ティック コールバックを使用してメモリと実行時間を測定するプロファイラーに取り組んでいました。最初は、配列を使用してイベントをログに記録し、各ティック間隔ですべての測定値を追跡しました。これらの値を配列ではなく個別のスカラー変数に入れたら、パフォーマンスが大幅に向上したことがわかりました (それぞれ 100000 ~ 1000000 レコードで 10 ~ 20%)。

ただし、配列に少数のレコードしかない場合、スカラー変数との違いはほとんどなく、パフォーマンスは実際には問題になりません。そのような場合、配列は状況により適し、より効果的であり、読みやすさ、メンテナンスなどを改善します。

于 2015-11-04T02:19:40.287 に答える
2

データの処理方法によっては、すべてのデータを 1 つの配列に格納する方が高速になる場合があります。相互に密接な関係にあるデータの各グループを配列にグループ化することをお勧めします。

お役に立てれば。

于 2013-01-15T12:27:15.627 に答える
0

配列内のすべての相対データを作成すると、配列の方が高速です。

于 2013-01-15T12:25:15.917 に答える