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
应该更快     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...