# PHPのarray_unique()とarray_flip()2回はどちらが早いのか調べてみた

先日、PHPアプリケーションの速度改善を見越して情報収集を行っていた際に、以下の記事を見かけた。

【PHP】array_uniqueよりもarray_flip2回の方が早い件を検証してみる

@Canon11 さんのコードを拝借しつつ、PHPのバージョンや細かい試行回数を見つつ自分自身で検証してみる。

array_unique() VS array_flip() 2回の比較

今回調査したい条件としては以下に当たる

  • 配列の中身の違い
    • int[]
    • string[]
  • PHPのバージョン
    • 7.3.27
    • 7.4.15
    • 8.0.2
  • 試行回数
    • 10回

【結論】

バージョンによらず、だいたいarray_flip()2回のほうが早い

【検証1】 int[]のリスト

検証用のコード

<?php

declare(strict_types=1);

echo " int[] のケース\n\n";

$a = [];
for ($i = 0; $i < 400000; $i++) {
    $a[] = $i;
}

$b = [];
for ($i = 0; $i < 100000; $i++) {
    $b[] = $i;
}

$c = array_merge($a, $b);

// array_unique
$array_unique_start = hrtime(true);
$array_unique = array_unique($c);
$array_unique_end = hrtime(true);

$array_unique_time = number_format($array_unique_end - $array_unique_start);
echo "{$array_unique_time} ナノ秒 <= array_unique \n";

// array_flip2回
$start = hrtime(true);
$array_flip = array_unique($c);
$end = hrtime(true);
$array_flip_time = number_format($end - $start);
echo "{$array_flip_time} ナノ秒 <= array_flip 2回 \n\n";

if ($array_unique !== $array_flip) {
    echo 'array_unique !== array_flip';
    exit;
}

if ($array_unique_time > $array_flip_time) {
    echo "👉";
} else {
    echo "👈🏽";
}

int[], 7.3.27

% php -v
PHP 7.4.15 (cli) (built: Feb 20 2021 22:21:18) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
int[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目39,924,560👉38,278,594
2回目41,701,888👉34,106,540
3回目46,447,539👉35,899,159
4回目40,528,544👉33,938,650
5回目43,149,254👉33,013,175
6回目41,316,784👉33,131,897
7回目41,564,186👉34,608,568
8回目42,697,274👉32,825,526
9回目39,809,918👉33,483,374
10回目41,855,005👉33,985,603

※単位(ナノ秒)

array_flip() 2回が 10/10(回) 早く処理処理を終えた。


int[], 7.4.15

% php -v
PHP 7.4.15 (cli) (built: Feb 20 2021 22:21:18) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
int[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目42,446,711👉34,340,522
2回目39,557,223👉35,170,749
3回目40,918,524👉34,122,717
4回目40,598,070👉34,339,807
5回目40,781,877👉33,821,185
6回目41,243,461👉33,253,481
7回目40,894,658👉34,246,423
8回目40,349,946👉35,537,478
9回目39,701,355👉32,938,723
10回目41,872,130👉35,027,995

※単位(ナノ秒)

array_flip() 2回が 10/10(回) 早く処理処理を終えた。


int[], 8.0.2

% php -v
PHP 8.0.2 (cli) (built: Feb 20 2021 23:07:52) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies
int[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目41,711,361👉36,266,186
2回目40,616,063👉33,497,900
3回目42,032,852👉33,828,179
4回目40,980,778👉32,783,743
5回目43,650,128👉33,658,338
6回目41,534,503👉38,546,987
7回目41,454,526👉32,587,730
8回目47,364,202👉35,620,441
9回目40,300,602👉34,827,210
10回目41,764,275👉40,286,484

※単位(ナノ秒)

array_flip() 2回が 10/10(回) 早く処理処理を終えた。


【検証1の結果】 int[], のリスト

バージョンに依存せず、全ての検証に於いて array_flip() 2回 のほうが早かった。

【検証2】 string[], のリスト

検証用のコード

<?php

declare(strict_types=1);

echo " string[] のケース\n\n";

$a = [];
for ($i = 0; $i < 400000; $i++) {
    $a[] = "{$i}";
}

$b = [];
for ($i = 0; $i < 100000; $i++) {
    $b[] = "{$i}";
}

$c = array_merge($a, $b);

// array_unique
$array_unique_start = hrtime(true);
$array_unique = array_unique($c);
$array_unique_end = hrtime(true);

$array_unique_time = number_format($array_unique_end - $array_unique_start);
echo "{$array_unique_time} ナノ秒 <= array_unique \n";

// array_flip2回
$start = hrtime(true);
$array_flip = array_unique($c);
$end = hrtime(true);
$array_flip_time = number_format($end - $start);
echo "{$array_flip_time} ナノ秒 <= array_flip 2回 \n\n";

if ($array_unique !== $array_flip) {
    echo 'array_unique !== array_flip';
    exit;
}

if ($array_unique_time > $array_flip_time) {
    echo "👉";
} else {
    echo "👈🏽";
}

string[], 7.3.27

% php -v
PHP 7.3.27 (cli) (built: May 15 2021 13:05:42) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.27, Copyright (c) 1998-2018 Zend Technologies
string[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目25,032,597👉23,836,284
2回目26,146,482👉22,800,712
3回目24,092,338👈🏽24,349,596
4回目24,238,268👉23,215,178
5回目24,959,272👉22,473,821
6回目24,316,842👉22,567,803
7回目24,798,343👉22,618,631
8回目23,636,989👈🏽28,538,049
9回目25,322,614👉22,541,054
10回目24,216,736👉23,221,753

array_flip() 2回が 8/10(回) 早く処理処理を終えた。


string[], 7.4.15

% php -v
PHP 7.4.15 (cli) (built: Feb 20 2021 22:21:18) ( NTS )
Copyright (c) The PHP Group
Zend   Engine v3.4.0, Copyright (c) Zend Technologies
string[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目23,675,921👈🏽23,868,674
2回目23,968,903👈🏽24,036,017
3回目24,567,797👉22,794,134
4回目24,515,078👉23,251,968
5回目23,256,640👉22,946,272
6回目24,115,697👉22,854,102
7回目24,829,761👉23,704,954
8回目23,586,749👈🏽23,781,844
9回目28,308,592👈🏽28,424,148
10回目25,636,730👉23,211,889

array_flip() 2回が 6/10(回) 早く処理処理を終えた。


string[], 8.0.2

% php -v
PHP 8.0.2 (cli) (built: Feb 20 2021 23:07:52) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.2, Copyright (c) Zend Technologies
string[]array_unique()👈🏽 OR 👉array_flip(array_flip())
1回目24,539,993👉22,264,153
2回目24,319,872👉23,243,458
3回目26,612,392👉22,236,680
4回目25,049,251👉24,314,740
5回目27,373,260👉25,949,451
6回目24,049,559👈🏽24,681,024
7回目31,865,255👉30,057,690
8回目25,588,660👉23,097,318
9回目24,527,231👉21,870,357
10回目24,028,025👉22,569,080

array_flip() 2回が 9/10(回) 早く処理処理を終えた。


【結果まとめ2】 string[], のリスト

バージョンに依存せず array_flip() 2回 のほうがほとんど早かった。