哪个更快:in_array()或PHP中的一堆表达式?

Dar*_*ein 15 php arrays if-statement

执行以下操作更快:

 if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') { ... }
Run Code Online (Sandbox Code Playgroud)

要么:

 if (!in_array($var, array('test1', 'test2', 'test3', 'test4') { ... }
Run Code Online (Sandbox Code Playgroud)

是否有许多值,在这一点上做一个或另一个更快?

(在这种情况下,第二个选项中使用的数组并不存在.)

Owe*_*wen 17

我强烈建议使用in_array(),任何速度差异都可以忽略不计,但分别测试每个变量的可读性是可怕的.

只是为了好玩这里是我跑的测试:

$array = array('test1', 'test2', 'test3', 'test4');
$var = 'test';
$iterations = 1000000;

$start = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if ($var != 'test1' && $var != 'test2' && $var != 'test3' && $var != 'test4') {}
}
$end = microtime(true);

print "Time1: ". ($end - $start)."<br />";

$start2 = microtime(true);
for($i = 0; $i < $iterations; ++$i) {
    if (!in_array($var, $array) ) {}
}
$end2 = microtime(true);

print "Time2: ".($end2 - $start2)."<br />";

// Time1: 1.12536692619
// Time2: 1.57462596893
Run Code Online (Sandbox Code Playgroud)

需要注意的微不足道的注意事项,如果$var未设置,方法1需要更长时间(取决于您测试的条件数)

  • 另外,你通过将 array(...) 移出循环来稍微作弊 - 如果你按照问题所述使用它,我的 time2 会超过 6 秒 (2认同)

Rob*_*Rob 8

请注意,如果您要替换一堆!==语句,则应将第三个参数传递给in_arrayas true,这会强制对数组中的项进行类型检查.

!=显然,普通并不需要这个.


Gre*_*reg 6

第一个会更快 - 第二个会有很多开销:创建数组,调用函数,搜索数组......

然而,正如我在一个问题中提到的几个答案,过早的优化是所有邪恶的根源.您应该将代码编写为可读,然后如果需要对其进行优化配置,则进行优化.

编辑:

我的时间与@ Owen的代码(PHP 5.2.6/windows):

Time1: 1.33601498604
Time2: 4.9349629879
Run Code Online (Sandbox Code Playgroud)

在循环内移动数组(...),如问题所示:

Time1: 1.34736609459
Time2: 6.29464697838
Run Code Online (Sandbox Code Playgroud)


Jea*_*eau 6

这是此长凳与另一个案例的实时更新https://3v4l.org/OA2S7

PHP 7.3 的结果:

  • 多重比较:0.0575 07991790771

  • 数组中:0.0256 8507194519

  • array_flip() 外循环测量 + isset(): 0.0146 78001403809

  • array_flip() 外部循环未测量 + isset(): 0.0156 50033950806

  • foreach 和比较:0.0627 82049179077