Rap*_*ann 5 php arrays performance loops coding-style
如果我有一个包含多个键和值的数组,就像这样。
$array = array(
'key1' => 'value1',
'key2' => 'value2',
);
Run Code Online (Sandbox Code Playgroud)
当我仅使用键时,是否有任何标准如何遍历数组?解决方案1:
foreach(array_keys($array) as $array_key) {
echo $array_key;
}
Run Code Online (Sandbox Code Playgroud)
解决方案2:
foreach($array as $array_key => $array_value) {
echo $array_key;
}
Run Code Online (Sandbox Code Playgroud)
我可以在解决方案1中看到优点,因为它不调用未使用的变量$array_value。两者之间的表现有区别吗?有什么标准怎么做?
ali*_*col 13
从我快速而肮脏的基准测试中,我做了以下 50 次:
解决方案 1(最差):
foreach (array_keys($array) as $array_key) {
echo $array_key;
}
Run Code Online (Sandbox Code Playgroud)
数组大小:1000000
0.113632917404170.116814622879030.14569497108459数组大小:9999999
1.30981993675231.32505773544311.3673560619354解决方案2(中):
foreach ($array as $array_key => $array_value) {
echo $array_key;
}
Run Code Online (Sandbox Code Playgroud)
数组大小:1000000
0.101675033569340.103561301231380.11027193069458数组大小:9999999
1.20778703689581.22563143253331.2829539775848解决方案 3(最佳):
$array_keys = array_keys($array);
foreach ($array_keys as $array_key) {
echo $array_key;
}
Run Code Online (Sandbox Code Playgroud)
数组大小:1000000
0.0909118652343750.0929384374618530.097810983657837数组大小:9999999
1.07933497428891.09411101341251.1402878761292因此,如果您只想查看数组键,则可以看到解决方案 3 是最快的选项:)
希望这可以帮助。
代码:
<?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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1740 次 |
| 最近记录: |