如何解决PHP in_array糟糕的性能寻找数组值的最佳方法
|| 我有以下简单的代码来测试我正在创建的主键上的冲突:$machine_ids = array();
for($i = 0; $i < 100000; $i++) {
//Generate machine id returns a 15 character alphanumeric string
$mid = Functions::generate_machine_id();
if(in_array($mid,$machine_ids)) {
die(\"Collision!\");
} else {
$machine_ids[] = $mid;
}
}
die(\"Success!\");
知道为什么要花很多时间才能运行吗?无论如何要加快速度?
解决方法
for($i = 0; $i < 100000; $i++)
{
//Generate machine id returns a 15 character alphanumeric string
$mid = Functions::generate_machine_id();
if (isset($machine_ids[$mid]))
{
die(\"Collision!\");
}
$machine_ids[$mid] = true;
}
,为此,使用“ 2”作为键,并使用哑数值作为值。具体来说,代替
if(in_array($mid,$machine_ids)) {
die(\"Collision!\");
} else {
$machine_ids[] = $mid;
}
采用
if(isset($machine_ids[$mid])) {
die(\"Collision!\");
} else {
$machine_ids[$mid] = 1;
}
最后,您可以使用array_keys($machine_ids)
提取您最初想要的数组。
这应该快得多。如果仍然很慢,那么您的Functions::generate_machine_id()
就会很慢。
根据评论添加comments7ѭ。
,检查数组成员身份是一项O(n)操作,因为您必须将值与数组中的每个元素进行比较。将一堆东西添加到数组后,它自然会变慢。
如果您需要进行大量成员资格测试(如此处的情况),则应使用支持O(1)成员资格测试的其他数据结构,例如哈希。
,重构代码,以便它使用关联的数组保存计算机ID并使用ѭ7进行检查
if( isset($machine_id[$mid]) ) die(\"Collision\");
$machine_ids[$mid] = $mid;
使用isset
应该更快
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。