首页 > 解决方案 > 需要 PHP 代码性能优化帮助

问题描述

我有以下代码,它检查元素是否存在,如果存在,它检查相同的名称,并在末尾增加一个数字。

例如,它检查数组 $this->elements 中是否存在键“test”,如果存在,则检查“test2”,依此类推,直到键不存在。

我的原始代码是:

if (isset($this->elements[$desired])) {
    $inc = 0;
    do {
        $inc++;
        $new_desired = $desired . $inc;
    } while (isset($this->elements[$new_desired]));
    $desired = $new_desired;
}

我试过:

if (isset($this->elements[$desired])) {
    return $this->generateUniqueElement($desired, $postfix);
}

private function generateUniqueElement($desired, $postfix) {
    $new_desired = $desired . $postfix;
    return isset($this->elements[$new_desired]) ? $this->generateUniqueElement($desired, ++$postfix) : $new_desired;
}

但在我的测试中,速度并没有提高。

知道如何改进代码吗?在所有页面上,此代码被调用超过 10 000 次。有时甚至超过 10 万次。

期待感谢!

标签: phpperformance

解决方案


如果不进一步了解如何生成此列表,这里有一个想法:

$highestElementIds = [];
foreach($this->elements as $element) {
    preg_match('/(.*?)(\d+)/', $element, $matches);
    $text = $matches[1];
    $id = (int)$matches[2];
    if(!isset($highestElementIds[$text])) {
        $highestElementIds[$text] = $id;
    } else {
        if($id > $highestElementIds[$text]) {
            $highestElementIds[$text] = $id;
        }
    }
}

// find some element by a simple array access
$highestElementIds['test'];  // will return 2 in your example

如果您的代码确实被调用了 100k 次,那么只迭代一次列表然后直接从包含最高数字的数组中获取最高 id 应该会快得多(因为您不需要再次遍历它) .

话虽如此,我仍然想知道首先拥有如此庞大的数组的真正原因是什么……


推荐阅读