【问题标题】:Why applying isset to a multidimensional array increased execution time by 4000%?为什么将 isset 应用于多维数组会增加 4000% 的执行时间?
【发布时间】:2015-09-24 14:26:56
【问题描述】:

编辑: 原来$article->getID(); 是导致执行时间过长的部分。这是它的样子:

public function getId()
{
    return $this->id;
}

但我仍然不知道为什么会这样。


我正在使用此代码尝试为包含 1000 个文档和 4000 个唯一令牌的小型语料库中的每个令牌计算 document frequency

为此,我编写了这个函数:

public function computeIDF(){
    // splitting documents into tokens
    $this->tokens = $this->tokenize();
    // $this->tokens = array($article->id => array($token => $freq))

    // 1. For each token …
    foreach($this->tokens as $token){

        // 2. … look in every document …
        foreach($this->articles as $article){

            // 3. … and if it exists there …
            if(isset($this->tokens[$article->getID()][$token]){

                // 4. … add 1
                $tokFreq[$token] += 1;
            }
        }
    }
}

但是第 3 步引起了很多麻烦:
- 如果我注释掉步骤4.,则没有任何变化;
- 如果我注释掉步骤3.,执行时间会从414.2s 变为“刚刚”14s,这几乎快了4000%!!1! (所以,当然,这不是一个“微优化”问题。

注意这里不涉及数据库。一切都早早地被提取了,超出了整个 class' 范围:

// This is where the data is being fetched
$articles = ArticleDAO::loadLast(1000);

// It's then injected into the $corpus
$corpus = new Corpus($articles);

我在这里做错了吗?如果是这样,我怎样才能让事情变得更快?

【问题讨论】:

  • 那个吸气剂$article->getID()到底在做什么?只是归还房产?从数据库加载东西?
  • 这里不涉及数据库。一切都提前获取了。
  • 先生。 Downvoter,如果你读到这个,你介意解释一下你的意图吗?谢谢。
  • 如果只将 3 替换为 $article->getID();,执行时间会怎样?
  • 我不明白这里发生了什么!我使用$article->getID(); 运行测试,执行时间再次飙升。从内部看是这样的:public function getID(){ return $this->id; } 有什么解释吗?

标签: php arrays performance multidimensional-array isset


【解决方案1】:

$article->getID() 的每次调用都有开销。它必须保存堆栈,调用函数,复制结果,然后恢复。因为您要为每篇文章迭代每个令牌(而不是相反),所以每次调用 getID 都将针对不同的文章,因此不能走捷径。

你可以做两件事:

  1. 仅将 $article->getID() 替换为 $article->id
  2. 在文章之间建立外循环,在令牌之间建立内循环。这样一来,您就可以在一篇文章中找到有助于缓存的整批令牌。

【讨论】:

  • 显然,这是我目睹的延迟的原因。反转循环顺序是不可能的(从逻辑 PoV),所以我 public'd Article 类中的 $id 字段,至少,作为暂时的解决方法。
  • 为什么反转循环是不可能的?它应该为您带来相同的结果。您仍然涵盖令牌/文章的每种组合。
  • 因为我的逻辑被打破了,这就是原因。另一方面,交换循环将需要另一个循环,这可能(或可能不会)将其负载添加到酱汁中。我将立即实施,我们将看看会发生什么。谢谢:)
猜你喜欢
  • 1970-01-01
  • 2020-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2021-09-21
  • 2019-06-17
  • 1970-01-01
相关资源
最近更新 更多