需要PHP代码性能优化帮助



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

例如,它检查的是密钥";测试";存在于数组$this->元素,如果存在,则检查";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万次。

期待的感谢!

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

$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;
echo generateNewElement('foo'), PHP_EOL;
echo generateNewElement('foo'), PHP_EOL;
0foo
1foo
2foo
3foo

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

相关内容

  • 没有找到相关文章

最新更新