Issue
If I have an array with multiple keys and values, like this:
$array = array(
'key1' => 'value1',
'key2' => 'value2',
);
Are there any best-practices on how to loop through an array when I only use the keys?
Possible solution 1:
foreach(array_keys($array) as $array_key) {
echo $array_key;
}
Possible solution 2:
foreach($array as $array_key => $array_value) {
echo $array_key;
}
I can see the advantage in solution 1 as it doesn't include the unused variable $array_value
. Is there a difference in performace (speed, memory allocation, etc.) between these two?
Solution
Warning: the benchmark below is not accurate that makes its results wrong.
From my quick and dirty benchmark I did the following 50 times:
Solution 1 (worst):
foreach (array_keys($array) as $array_key) {
echo $array_key;
}
Size of array: 1000000
- Min:
0.11363291740417
- Avg:
0.11681462287903
- Max:
0.14569497108459
Size of array: 9999999
- Min:
1.3098199367523
- Avg:
1.3250577354431
- Max:
1.3673560619354
Solution 2 (middle):
foreach ($array as $array_key => $array_value) {
echo $array_key;
}
Size of array: 1000000
- Min:
0.10167503356934
- Avg:
0.10356130123138
- Max:
0.11027193069458
Size of array: 9999999
- Min:
1.2077870368958
- Avg:
1.2256314325333
- Max:
1.2829539775848
Solution 3 (best):
$array_keys = array_keys($array);
foreach ($array_keys as $array_key) {
echo $array_key;
}
Size of array: 1000000
- Min:
0.090911865234375
- Avg:
0.092938437461853
- Max:
0.097810983657837
Size of array: 9999999
- Min:
1.0793349742889
- Avg:
1.0941110134125
- Max:
1.1402878761292
So you can see solution 3 is the quickest option if you only want to look through array keys :)
Hope this helps.
Code:
<?php
class DirtyBenchmarker {
private $results = [];
private $size_of_array;
public function __construct($size_of_array)
{
$this->size_of_array = $size_of_array;
echo 'Size of array: ' . $this->size_of_array . PHP_EOL;
}
private function solution1() {
$array = range(0, $this->size_of_array - 1);
ob_start();
$start = microtime(true);
foreach (array_keys($array) as $array_key) {
echo $array_key;
}
$finish = microtime(true) - $start;
$echod = ob_get_clean();
$this->results['solution1'][] = $finish;
}
private function solution2() {
$array = range(0, $this->size_of_array - 1);
ob_start();
$start = microtime(true);
foreach ($array as $array_key => $array_value) {
echo $array_key;
}
$finish = microtime(true) - $start;
$echod = ob_get_clean();
$this->results['solution2'][] = $finish;
}
private function solution3() {
$array = range(0, $this->size_of_array - 1);
$array_keys = array_keys($array);
ob_start();
$start = microtime(true);
foreach ($array_keys as $array_key) {
echo $array_key;
}
$finish = microtime(true) - $start;
$echod = ob_get_clean();
$this->results['solution3'][] = $finish;
}
public function benchmark() {
$this->solution1();
$this->solution2();
$this->solution3();
}
public function getResults()
{
echo PHP_EOL . 'Solution 1:' . PHP_EOL;
echo 'Min: ' . min($this->results['solution1']) . PHP_EOL;
echo 'Avg: ' . array_sum($this->results['solution1']) / count($this->results['solution1']) . PHP_EOL;
echo 'Max: ' . max($this->results['solution1']) . PHP_EOL;
echo PHP_EOL . 'Solution 2:' . PHP_EOL;
echo 'Min: ' . min($this->results['solution2']) . PHP_EOL;
echo 'Avg: ' . array_sum($this->results['solution2']) / count($this->results['solution2']) . PHP_EOL;
echo 'Max: ' . max($this->results['solution2']) . PHP_EOL;
echo PHP_EOL . 'Solution 3:' . PHP_EOL;
echo 'Min: ' . min($this->results['solution3']) . PHP_EOL;
echo 'Avg: ' . array_sum($this->results['solution3']) / count($this->results['solution3']) . PHP_EOL;
echo 'Max: ' . max($this->results['solution3']) . PHP_EOL;
}
}
$benchmarker = new DirtyBenchmarker(1000000);
$runs = 50;
for ($i = 0; $i < $runs; $i++) {
$benchmarker->benchmark();
}
$benchmarker->getResults();
$benchmarker = new DirtyBenchmarker(9999999);
$runs = 50;
for ($i = 0; $i < $runs; $i++) {
$benchmarker->benchmark();
}
$benchmarker->getResults();
Answered By - alistaircol Answer Checked By - Marilyn (PHPFixing Volunteer)
0 Comments:
Post a Comment
Note: Only a member of this blog may post a comment.