Skip to content

Instantly share code, notes, and snippets.

@rybakit
Created July 5, 2016 07:24
Show Gist options
  • Select an option

  • Save rybakit/12dc8508b5d144a910bdc2829403d7b0 to your computer and use it in GitHub Desktop.

Select an option

Save rybakit/12dc8508b5d144a910bdc2829403d7b0 to your computer and use it in GitHub Desktop.
array_values vs array_keys + range + count
<?php
function range_keys($n, $data) {
for ($i = 0; $i < $n; ++$i) {
if ($data) {
$r = array_keys($data) !== range(0, count($data) - 1);
} else {
$r = [];
}
}
}
function values($n, $data) {
for ($i = 0; $i < $n; ++$i) {
$r = array_values($data) !== $data;
}
}
function empty_loop($n) {
for ($i = 0; $i < $n; ++$i) {
}
}
function getmicrotime()
{
$t = gettimeofday();
return ($t['sec'] + $t['usec'] / 1000000);
}
function start_test()
{
ob_start();
return getmicrotime();
}
function end_test($start, $name, $overhead = null)
{
global $total;
global $last_time;
$end = getmicrotime();
ob_end_clean();
$last_time = $end-$start;
$total += $last_time;
$num = number_format($last_time,3);
$pad = str_repeat(" ", 28 - strlen($name) - strlen($num));
if (is_null($overhead)) {
echo $name.$pad.$num."\n";
} else {
$num2 = number_format($last_time - $overhead, 3);
echo $name.$pad.$num." ".$num2."\n";
}
ob_start();
return getmicrotime();
}
function total()
{
global $total;
$pad = str_repeat("-", 28);
echo $pad."\n";
$num = number_format($total,3);
$pad = str_repeat(" ", 28 - strlen("Total")-strlen($num));
echo "Total".$pad.$num."\n";
}
const N = 100000;
$t0 = $t = start_test();
empty_loop(N);
$t = end_test($t, 'empty_loop');
$overhead = $last_time;
// ========================
$size = 0;
$data = [];
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 100;
$data = range(0, $size - 1);
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 1000;
$data = range(0, $size - 1);
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 10000;
$data = range(0, $size - 1);
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 100;
$data = range(0, $size - 2);
$data['z'] = $size;
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 1000;
$data = range(0, $size - 2);
$data['z'] = $size;
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
// ========================
$size = 10000;
$data = range(0, $size - 2);
$data['z'] = $size;
values(N, $data);
$t = end_test($t, "values($size)", $overhead);
range_keys(N, $data);
$t = end_test($t, "range_keys($size)", $overhead);
total();
$ php tests/bench_range_vs_values.php
empty_loop 0.001
values(0) 0.005 0.005
range_keys(0) 0.002 0.001
values(100) 0.116 0.115
range_keys(100) 0.166 0.165
values(1000) 1.177 1.176
range_keys(1000) 2.001 2.000
values(10000) 12.136 12.136
range_keys(10000) 20.215 20.214
values(100) 0.125 0.124
range_keys(100) 0.173 0.172
values(1000) 1.183 1.183
range_keys(1000) 2.046 2.045
values(10000) 12.168 12.168
range_keys(10000) 20.260 20.260
----------------------------
Total 71.775
$ php -v
PHP 7.0.5 (cli) (built: Apr 23 2016 10:48:01) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2016, by Zend Technologies
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment