我和一位同事讨论了哪个更快,我们做了一个小的基准测试:
function uniqueByKey(){
$strings = [];
$stopwatch->start('test');
for ($i = 1; $i <= 1000000; $i++) {
$strings[RandomStringUtil::generate()] = 1;
}
$outcome = $stopwatch->stop('test');
die($outcome->getDuration()/1000);
self::assertSame(25, count($strings));
}
和
function uniqueByFunction(){
$strings = [];
$stopwatch->start('test');
for ($i = 1; $i <= 1000000; $i++) {
$strings[] = RandomStringUtil::generate();
}
$strings = array_unique($strings);
$outcome = $stopwatch->stop('test');
die($outcome->getDuration()/1000);
self::assertSame(25, count($strings));
}
我原以为方法uniqueByKey
会更快,因为通过键访问数组非常快,而且数组unique现在有1.000.000个值来检查唯一性。
然而,uniqueByKey
(平均几次运行(持续约12.5秒,uniqueByFunction
仅约11.8秒
在我们的用例中,我们只循环25x,所以这种差异不值得注意,但我们很好奇为什么后者比前者更快。有人能解释一下吗?
如果重要的话,在MacbookPro 2020版上测试(
我试试这个:
$base = [];
for ($i = 0; $i < 1000000; $i++) {
$base[] = md5($i);
}
$start = microtime(true);
$array1 = [];
foreach ($base as $random) {
$array1[$random] = 1;
}
$end = microtime(true);
echo $end - $start . PHP_EOL;
$start = microtime(true);
$array2 = [];
foreach ($base as $random) {
$array2[] = $random;
}
$array2 = array_unique($array2);
$end = microtime(true);
echo $end - $start . PHP_EOL;
我得到了和你一样的结果,但如果我尝试这个:
$base = [];
for ($i = 0; $i < 1000000; $i++) {
$base[] = md5($i);
$base[] = md5($i);
$base[] = md5($i);
}
$start = microtime(true);
$array1 = [];
foreach ($base as $random) {
$array1[$random] = 1;
}
$end = microtime(true);
echo $end - $start . PHP_EOL;
$start = microtime(true);
$array2 = [];
foreach ($base as $random) {
$array2[] = $random;
}
$array2 = array_unique($array2);
$end = microtime(true);
echo $end - $start . PHP_EOL;
我得到了相反的结果。array_unique
并非总是更快的