首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要PHP代码性能优化帮助

需要PHP代码性能优化帮助
EN

Stack Overflow用户
提问于 2020-08-12 15:40:46
回答 2查看 52关注 0票数 0

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

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

我的原始代码是:

代码语言:javascript
复制
if (isset($this->elements[$desired])) {
    $inc = 0;
    do {
        $inc++;
        $new_desired = $desired . $inc;
    } while (isset($this->elements[$new_desired]));
    $desired = $new_desired;
}

我尝试过:

代码语言:javascript
复制
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万次。

期待中的感谢!

EN

回答 2

Stack Overflow用户

发布于 2020-08-12 15:56:15

在不进一步了解如何生成此列表的情况下,这里有一个想法:

代码语言:javascript
复制
$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会快得多(因为你不需要再次迭代它)。

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

票数 1
EN

Stack Overflow用户

发布于 2020-08-12 15:56:21

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

代码语言:javascript
复制
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;
代码语言:javascript
复制
0foo
1foo
2foo
3foo

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63371962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档