需要PHP代码性能优化帮助

问题描述

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

例如,它检查$ test-> 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;
}

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

有什么想法可以改善代码吗?在所有页面上,此代码被调用超过1万次。有时甚至超过10万次。

期待中的感谢!

解决方法

在不进一步了解如何生成此列表的情况下,这是一个主意:

$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

如果您的代码确实被调用了10万次,则只对列表进行一次迭代,然后直接从包含最高编号的数组中直接获得最高ID会更快很多(因为您无需遍历整个序列)再次)。

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

,

典型的唯一ID是随机数(UUID或随机字符)或序列号。后者非常简单,可以使用一个简单的计数器生成:

function generateNewElement($postfix) {
    static $i = 0;
    return sprintf('%d%s',$i++,$postfix);
}
echo generateNewElement('foo'),PHP_EOL;
echo generateNewElement('foo'),PHP_EOL;
0foo
1foo
2foo
3foo

当然,这只是一个通用解决方案,因此它可能不适合您的特定用例。

相关问答

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