问题描述
||
我有以下简单的代码来测试我正在创建的主键上的冲突:
$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
应该更快