PHP函数的优化

PHP函数的优化,php,symfony,Php,Symfony,我有一个Symfony函数,需要很多优化。此函数用于将一个问题与其所有答案进行比较,以计算每个答案的分数。问题是每个问题都有大约1000个答案。每次考试最多有60个问题。 所有问题字段和回答字段都是布尔值。 问题和回答都是对象。 我该如何做才能加快速度并减少内存消耗 public function correctionReponseTest($question) { $reponses = $question->getReponses(); if ($question-&g

我有一个Symfony函数,需要很多优化。此函数用于将一个问题与其所有答案进行比较,以计算每个答案的分数。问题是每个问题都有大约1000个答案。每次考试最多有60个问题。 所有问题字段和回答字段都是布尔值。 问题和回答都是对象。 我该如何做才能加快速度并减少内存消耗

public function correctionReponseTest($question)
{
    $reponses = $question->getReponses();
    if ($question->getMultipleChoices())
        $bareme = $this->_em->getRepository(Bareme::class)
            ->findOneBy(['nom' => 'QCM']);
    else
        $bareme = $this->_em->getRepository(Bareme::class)
            ->findOneBy(['nom' => 'QCS']);

    $item1V = $question->getItem1Vrai();
    $item2V = $question->getItem2Vrai();
    $item3V = $question->getItem3Vrai();
    $item4V = $question->getItem4Vrai();
    $item5V = $question->getItem5Vrai();
    $item1A = $question->getItem1Annule();
    $item2A = $question->getItem2Annule();
    $item3A = $question->getItem3Annule();
    $item4A = $question->getItem4Annule();
    $item5A = $question->getItem5Annule();


    foreach ($reponses as $reponse) {
        $repA = $reponse->getA();
        $repB = $reponse->getB();
        $repC = $reponse->getC();
        $repD = $reponse->getD();
        $repE = $reponse->getE();
        $repAv = $reponse->getAv();
        $repBv = $reponse->getBv();
        $repCv = $reponse->getCv();
        $repDv = $reponse->getDv();
        $repEv = $reponse->getEv();
        $repV = $reponse->getV();
        if (!$reponse || ($repA == null && $repAv == null && $repB == null &&
                $repBv == null && $repC == null && $repCv == null &&
                $repD == null && $repDv == null && $repE == null &&
                $repEv == null && $repV == null)
        ) {
            $nbBonnesReponses = 0;
        } 
        else {
            if ($repV) {
                $nbBonnesReponses =
                    (($item1V == $repAv) || ($item1A))
                    + (($item2V == $repBv) || ($item2A))
                    + (($item3V == $repCv) || ($item3A))
                    + (($item4V == $repDv) || ($item4A))
                    + (($item5V == $repEv) || ($item5A));
            } 
            else {
                $nbBonnesReponses =
                    (($item1V == $repA) || ($item1A))
                    + (($item2V == $repB) || ($item2A))
                    + (($item3V == $repC) || ($item3A))
                    + (($item4V == $repD) || ($item4A))
                    + (($item5V == $repE) || ($item5A));
            }
        }
        $reponse->setNote($bareme->getScore($nbBonnesReponses));
        $this->_em->flush();
    }
}
QC表结构:

CREATE TABLE `qc` (
`id` int(11) NOT NULL,
`ordre` int(11) DEFAULT NULL,
`titre` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
`enonce` longtext COLLATE utf8_unicode_ci,
`item1` longtext COLLATE utf8_unicode_ci,
`item2` longtext COLLATE utf8_unicode_ci,
`item3` longtext COLLATE utf8_unicode_ci,
`item4` longtext COLLATE utf8_unicode_ci,
`item5` longtext COLLATE utf8_unicode_ci,
`corrige_item1` longtext COLLATE utf8_unicode_ci,
`corrige_item2` longtext COLLATE utf8_unicode_ci,
`corrige_item3` longtext COLLATE utf8_unicode_ci,
`corrige_item4` longtext COLLATE utf8_unicode_ci,
`corrige_item5` longtext COLLATE utf8_unicode_ci,
`item1_vrai` tinyint(1) DEFAULT NULL,
`item2_vrai` tinyint(1) DEFAULT NULL,
`item3_vrai` tinyint(1) DEFAULT NULL,
`item4_vrai` tinyint(1) DEFAULT NULL,
`item5_vrai` tinyint(1) DEFAULT NULL,
`multiple_choices` tinyint(1) DEFAULT NULL,
`inclu` tinyint(1) DEFAULT NULL,
`donnees` longtext COLLATE utf8_unicode_ci,
`item1_Annule` tinyint(1) DEFAULT NULL,
`item2_Annule` tinyint(1) DEFAULT NULL,
`item3_Annule` tinyint(1) DEFAULT NULL,
`item4_Annule` tinyint(1) DEFAULT NULL,
`item5_Annule` tinyint(1) DEFAULT NULL,
`qcPere` int(11) DEFAULT NULL,
`id_colle` int(11) DEFAULT NULL,
`id_tuteur` int(11) DEFAULT NULL,
`coefficient` decimal(10,2) DEFAULT '1.00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

调用flush将把更改提交给数据库。由于在执行循环(?)时没有从数据库中检索任何新信息,因此在循环结束之前不必运行flush()


因此,将flush()移出循环。

只需思考。我希望更多地使用阵列。i、 e.
$questionItem[$itemIdx]=$question->getItemVrai($itemIdx)。但是,我需要查看数据库表结构、一些示例表数据和预期输出。我怀疑应该存储为行的信息被存储为列。我怀疑代码可以删除很多硬编码的变量名,并且仍然很容易理解。事实上,您是对的。我已经考虑过创建一个项目实体。我甚至试过一次,但我有两个问题:-我希望我的问题实体现在只有5个项目实体,我不知道如何设置限制,轻松创建每个问题及其5个项目,并为这些项目设置特定的顺序。-我担心实体相乘会对性能造成伤害,尤其是在所有计算都已经花费了大量时间的情况下。我用表结构更新了我的问题。我建议您总是尝试使用SQL的最简单的“自然关系”,这是
,用于重复项而不是列。依我看,你没有足够的数据在台式电脑上引起性能问题。好吧,那我试试。我也认为这是一个更好的主意。我在圈外同花顺,它已经运行得更好了。谢谢