Skip to content

Instantly share code, notes, and snippets.

@KVytyagov
Last active October 9, 2019 10:45
Show Gist options
  • Save KVytyagov/7fa062de71e338a0feb1655432e38a57 to your computer and use it in GitHub Desktop.
Save KVytyagov/7fa062de71e338a0feb1655432e38a57 to your computer and use it in GitHub Desktop.
Check performance to get unique values from array
<?php
$iterations = 10;
$originValuesTo = 10000;
$duplicateValuesTo = 10000;
$duplicatesCount = 2;
$a = range(0, $originValuesTo);
$b = range(0, $duplicateValuesTo);
function convertToStringsArray(array $intArray): array {
return array_map(function ($val): string {
return (string) $val;
}, $intArray);
}
$a = convertToStringsArray($a);
$b = convertToStringsArray($b);
$arrayToTest = array_merge($a, ...array_fill_keys(range(0, $duplicatesCount), $b));
function arrayKeysForeachMethod(array $arr) {
$map = [];
foreach ($arr as $item) {
$map[$item] = null;
}
return array_keys($map);
}
function arrayKeysReduceMethod(array $arr) {
$map = array_reduce($arr, function (array $carry, $item): array {
$carry[$item] = null;
return $carry;
}, []);
return array_keys($map);
}
function arrayValuesUnique(array $arr) {
return array_values(array_unique($arr));
}
$testFunctions = [
'arrayKeysForeachMethod',
'arrayKeysReduceMethod',
'arrayValuesUnique',
];
foreach ($testFunctions as $functionName) {
$results = [];
for($i = 0; $i < $iterations; ++$i) {
$start = microtime(true);
$memoryPeakOnStart = memory_get_peak_usage(true);
shuffle($arrayToTest);
$res = $functionName($arrayToTest);
$time = microtime(true) - $start;
$memoryPeakIncrease = memory_get_peak_usage(true) - $memoryPeakOnStart;
$results['times'][] = $time;
$results['memoryPeak'][] = $memoryPeakIncrease;
}
echo sprintf(
"Method '%s'\n\tavgTime: %f\n\tavgMemoryPeak: %d\n",
$functionName,
array_sum($results['times']) / count($results['times']),
array_sum($results['memoryPeak']) / count($results['memoryPeak'])
);
}
@KVytyagov
Copy link
Author

KVytyagov commented Oct 9, 2019

php -v
PHP 7.2.22-1+ubuntu18.04.1+deb.sury.org+1 (cli) (built: Sep  2 2019 12:54:33) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.2.22-1+ubuntu18.04.1+deb.sury.org+1, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans

=====
parameters

$iterations = 10;
$originValuesTo = 10000; // string 
$duplicateValuesTo = 10000;  // string 
$duplicatesCount = 2;

result

Method 'arrayKeysForeachMethod'
	avgTime: 0.008926
	avgMemoryPeak: 209715
Method 'arrayKeysReduceMethod'
	avgTime: 3.384428
	avgMemoryPeak: 0
Method 'arrayValuesUnique'
	avgTime: 0.008291
	avgMemoryPeak: 445644

====
parameters

$iterations = 10;
$originValuesTo = 10000; // string 
$duplicateValuesTo = 0;  // string 
$duplicatesCount = 2;

result

Method 'arrayKeysForeachMethod'
	avgTime: 0.003663
	avgMemoryPeak: 419430
Method 'arrayKeysReduceMethod'
	avgTime: 0.551939
	avgMemoryPeak: 0
Method 'arrayValuesUnique'
	avgTime: 0.001123
	avgMemoryPeak: 0

=====
parameters

$iterations = 10;
$originValuesTo = 10000; // int 
$duplicateValuesTo = 10000;  // string 
$duplicatesCount = 2;

result

Method 'arrayKeysForeachMethod'
	avgTime: 0.013143
	avgMemoryPeak: 209715
Method 'arrayKeysReduceMethod'
	avgTime: 3.467662
	avgMemoryPeak: 0
Method 'arrayValuesUnique'
	avgTime: 0.009293
	avgMemoryPeak: 445644

=====
parameters

$iterations = 10;
$originValuesTo = 10000; // string 
$duplicateValuesTo = 10000;  // int 
$duplicatesCount = 2;

result

Method 'arrayKeysForeachMethod'
	avgTime: 0.008036
	avgMemoryPeak: 209715
Method 'arrayKeysReduceMethod'
	avgTime: 3.443711
	avgMemoryPeak: 0
Method 'arrayValuesUnique'
	avgTime: 0.012713
	avgMemoryPeak: 445644

=====
parameters

$iterations = 10;
$originValuesTo = 10000; // int 
$duplicateValuesTo = 10000;  // int 
$duplicatesCount = 2;

result

Method 'arrayKeysForeachMethod'
	avgTime: 0.010146
	avgMemoryPeak: 209715
Method 'arrayKeysReduceMethod'
	avgTime: 3.112148
	avgMemoryPeak: 209715
Method 'arrayValuesUnique'
	avgTime: 0.012037
	avgMemoryPeak: 445644

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