# 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回 のほうがほとんど早かった。