簡體   English   中英

為什么 array_unique 版本更快

[英]Why is the array_unique version faster

我正在與一位速度更快的同事討論,我們做了一個小基准:

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更快,因為通過鍵訪問數組非常快,並且唯一的數組現在有 1.000.000 個值來檢查唯一性。

然而, uniqueByKey (平均運行幾次)持續約 12.5 秒,而uniqueByFunction僅約 11.8 秒。

在我們的用例中,我們只循環了 25 倍,所以差異並不值得注意,但是我們很好奇為什么后者比第一個更快。 誰能解釋一下?

如果重要,請在 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並不總是更快

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM