【发布时间】:2014-01-17 19:07:30
【问题描述】:
我阅读了这篇文章:faster than in_array?,但我尝试使用我的部分 php 代码进行实验。在我网站的数据库中,用户存储了一个由逗号分隔的文本子字符串组成的字符串(此处为 $UserString)。我最初是在检查用户输入 ($PostedVar) 是否是通过使用 foreach 循环分解 $UserString 创建的数组的成员(我重新创建了相关代码在这里):
$PostedVar = mysqli_real_escape_string($_POST['userinput']);
$CommaCount = substr_count($UserString, ',');
$ExplodedUserString = explode(",", $UserString);
$Break = 'nobreak';
$i = 1;
foreach ($ExplodedUserString as $EUS) {
$Current = $EUS;
if ($i > $CommaCount) {
break;
}
else if ($Current === $PostedVar) {
$Break = 'break';
break;
}
else {
$i++;
}
}//End foreach
if ($Break === 'break') {
echo "<script>
alert ('You have previously selected "'.$PostedVar.'". Please try again!');
location = 'home.php';
</script>"
}
else {
echo "<script>
alert ('Thanks for selecting "'.$PostedVar.'"!');
location = 'home.php';
</script>";
}
然后我比较了 foreach 与 in_array 以检查 $UserString,除了为 foreach 和 in_array 添加如下 2 个 microtime 语句外,所有操作完全相同:
//foreach method
$time1 = microtime();
$i = 1;
foreach ($ExplodedUserString as $EUS) {
$Current = $EUS;
if ($i > $CommaCount) {
break;
}
else if ($Current === $PostedVar) {
$Break = 'break';
break;
}
else {
$i++;
}
}//End foreach
$time2 = microtime();
$Diff = $time2 - $time1;
if ($Break === 'break') {
echo "<script>
alert ('$Diff');
location = 'home.php';
</script>"
}
else {
echo "<script>
alert ('$Diff');
location = 'home.php';
</script>";
}
对比:
//in_array method
$time1 = microtime();
if (in_array($PostedVar, $ExplodedUserString)) {
$Break = 'break';
}
$time2 = microtime();
$Diff = $time2 - $time1;
if ($Break === 'break') {
echo "<script>
alert ('$Diff');
location = 'home.php';
</script>"
}
else {
echo "<script>
alert ('$Diff');
location = 'home.php';
</script>";
}
我进行了 9 次试验,所有因素都保持不变(单击相同的提交按钮、相同的用户、相同的 $UserString 等)并抛出高值和低值...... $Diff 对 foreach 和 in_array 进行了 7 次试验对于 in_array 实际上快了 12%。请记住,这是针对 $UserString 的只有 5 个逗号分隔值的短字符串。特别是对于较大的字符串, in_array 不会比 foreach 循环更快吗?对我的网站而言,重要的是我预计典型 $UserString 值的字符数至少是我用来测试的 $UserString 的 10-20 倍。
【问题讨论】:
-
您也许可以通过使用更大的样本量自己回答这个问题。将(比如说)10ms 的运行时间与 8ms 的运行时间进行比较,提高了 20%,但速度上的差异是微不足道的。此外,您还没有发布测试的时间安排。在一串 10k 项上运行测试,然后看看会发生什么——你会得到更可靠的结果。百分比并不意味着脱离上下文
-
好的...公平点。不幸的是,我现在没有 10k 项要测试。我想我可以尝试重新测试一个更大的字符串。
-
你肯定可以只生成一个虚拟字符串吗?您可以将现有的测试数据复制并粘贴数百次
-
需要注意的一点:in_array 为我的目的做的事情与 foreach 一样,但行数要少得多....这是值得的!
-
肯定....会的。