【问题标题】:For large string of comma separated substrings, is foreach or in_array faster for checking?对于逗号分隔的子字符串的大字符串,检查 foreach 或 in_array 是否更快?
【发布时间】: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 一样,但行数要少得多....这是值得的!
  • 肯定....会的。

标签: php arrays foreach


【解决方案1】:

由于您在这两种情况下都在爆炸,因此您可能会考虑只爆炸到一个键值对并在您要查找的键上执行一个简单的 isset。我不能说性能会如何,而且如果没有查看 PHP 源代码,我会说 in_array 可能是自己的 foreach。

只是一个需要考虑的链接:

explode() into $key=>$value pair

【讨论】:

    猜你喜欢
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多