Skip to content

Instantly share code, notes, and snippets.

@lav45
Last active December 12, 2015 16:12
Show Gist options
  • Save lav45/efed1e93948cd8369699 to your computer and use it in GitHub Desktop.
Save lav45/efed1e93948cd8369699 to your computer and use it in GitHub Desktop.
benchmark array_unique() vs \yii\helpers\ArrayHelper::unique()
<?php
/**
* ~$ php -v
* PHP 7.0.0-5+deb.sury.org~trusty+1 (cli) ( NTS )
* Copyright (c) 1997-2015 The PHP Group
* Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies
* with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
*
* ~$ php test.php
* array_unique($arr) to 666667 in 1.4365818500519
* foreach + array_keys to 666667 in 0.050886869430542
* ArrayHelper::unique($arr) to 666667 in 0.034323215484619
* ArrayHelper::unique($arr, true) to 666667 in 0.041811943054199
*/
class ArrayHelper
{
public static function unique($array, $keepKeys = false)
{
if ($keepKeys === false) {
$result = array_keys(array_flip($array));
} else {
$result = array_flip(array_flip($array));
}
return $result;
}
}
$max = 10000;
$arr = array_merge(range(1, $max, 3), range(1, $max, 2));
$time = -microtime(true);
$res = array_unique($arr);
$time += microtime(true);
echo "array_unique(\$arr) to " . count($res) . " in " . $time . "\n";
$time = -microtime(true);
$res = [];
foreach ($arr as $key => $val) {
$res[$val] = true;
}
$res = array_keys($res);
$time += microtime(true);
echo "foreach + array_keys to " . count($res) . " in " . $time . "\n";
$time = -microtime(true);
$res = ArrayHelper::unique($arr);
$time += microtime(true);
echo "ArrayHelper::unique(\$arr, false) to " . count($res) . " in " . $time . "\n";
$time = -microtime(true);
$res = ArrayHelper::unique($arr, true);
$time += microtime(true);
echo "ArrayHelper::unique(\$arr) to " . count($res) . " in " . $time . "\n";
@AnatolyRugalev
Copy link

My results:

array_unique($arr)              to 666667 in 5.1696400642395
foreach + array_keys            to 666667 in 0.42175698280334
ArrayHelper::unique($arr)       to 666667 in 0.25078105926514
ArrayHelper::unique($arr, true) to 666667 in 0.29126000404358

@lav45
Copy link
Author

lav45 commented Dec 12, 2015

$max = 10;

array_unique($arr)              to 7 in 9.0599060058594E-6
foreach + array_keys            to 7 in 4.0531158447266E-6
ArrayHelper::unique($arr)       to 7 in 0.00046706199645996
ArrayHelper::unique($arr, true) to 7 in 1.9073486328125E-6

ArrayHelper::unique($arr, true) is winner

$max = 100;

array_unique($arr)              to 67 in 4.8160552978516E-5
foreach + array_keys            to 67 in 1.5020370483398E-5
ArrayHelper::unique($arr)       to 67 in 0.00049090385437012
ArrayHelper::unique($arr, true) to 67 in 4.0531158447266E-6

ArrayHelper::unique($arr, true) is winner

$max = 1000;

array_unique($arr)              to 667 in 0.00067901611328125
foreach + array_keys            to 667 in 4.6014785766602E-5
ArrayHelper::unique($arr)       to 667 in 0.00048303604125977
ArrayHelper::unique($arr, true) to 667 in 3.3140182495117E-5

ArrayHelper::unique($arr, true) is winner

$max = 10000;

array_unique($arr)              to 6667 in 0.0087559223175049
foreach + array_keys            to 6667 in 0.0003669261932373
ArrayHelper::unique($arr)       to 6667 in 0.00074100494384766
ArrayHelper::unique($arr, true) to 6667 in 0.00024795532226562

ArrayHelper::unique($arr, true) is winner

$max = 100000;

array_unique($arr)              to 66667 in 0.11483597755432
foreach + array_keys            to 66667 in 0.0052449703216553
ArrayHelper::unique($arr)       to 66667 in 0.0041589736938477
ArrayHelper::unique($arr, true) to 66667 in 0.004478931427002

ArrayHelper::unique($arr) is winner

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment