【问题标题】:PHP: in_array() vs array_intersect() performancePHP:in_array() 与 array_intersect() 性能
【发布时间】:2017-03-12 21:36:24
【问题描述】:
什么和多少更快 - 使用 foreach 手动迭代数组并使用 in_array() 或使用 array_intersect() 检查 needle 的出现?
【问题讨论】:
标签:
php
arrays
performance
benchmarking
array-intersect
【解决方案1】:
基准测试
测试脚本
<?php
$numbers = range(32, 127);
$numbersLetters = array_map('chr', $numbers);
for (;;) {
$numbersLetters = array_merge($numbersLetters, $numbersLetters);
if (count($numbersLetters) > 10000) {
break;
}
}
$numbers = range(1, count($numbersLetters));
printf("Sample size: %d elements in 2 arrays (%d total) \n", count($numbers), count($numbers) + count($numbersLetters));
printf("Benchmarking speed in foreach + in_array() scenario... (this might take a while) ");
shuffle($numbers);
shuffle($numbersLetters);
$t1 = microtime(true);
foreach ($numbers as $number) {
if (in_array($number, $numbersLetters)) {}
}
$t2 = microtime(true);
printf("DONE!\n");
printf("Time elapsed: %.5f \n", $t2 - $t1);
// =============================------------===============================
printf("Benchmarking speed with array_intersect...");
shuffle($numbers);
shuffle($numbersLetters);
$t1 = microtime(true);
array_intersect($numbers, $numbersLetters);
$t2 = microtime(true);
printf("DONE!\n");
printf("Time elapsed: %.5f \n", $t2 - $t1);
输出
Sample size: 12288 elements in 2 arrays (24576 total)
Benchmarking speed in foreach + in_array() scenario... (this might take a while) DONE!
Time elapsed: 3.79213
Benchmarking speed with array_intersect...DONE!
Time elapsed: 0.05765
小提琴:http://ideone.com/OZ2Idf
结论
array_intersect 比 foreach + in_array 快得多。
为什么array_intersect 更快?