php - 需要 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 万次。
期待感谢!
解决方案
如果不进一步了解如何生成此列表,这里有一个想法:
$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 应该会快得多(因为您不需要再次遍历它) .
话虽如此,我仍然想知道首先拥有如此庞大的数组的真正原因是什么……
推荐阅读
- c - 绘制简单点
- oracle - PL/SQL:语句被忽略和 PLS-00382:表达式在返回中的类型错误
- html - 为什么文本换行时div的宽度不正确?
- azure-devops - 多阶段 YAML 管道不应用特定于环境的 XML 转换
- php - 在购物车 WooCommerce 中仅允许 1 种特定产品的数量
- c - 如何检查在C中以dd-mm-yyyy形式输入日期的数字?
- python - 使用一个类创建的两个不同对象共享相同的内存
- python - 赋值前引用的局部变量“n”。闭包
- c# - 在 blazor 中使用带有身份验证的 WebAPI
- firebase - 用于列表构建的 Flutter 中的 Firestore 嵌套查询