PHP函数的优化
我有一个Symfony函数,需要很多优化。此函数用于将一个问题与其所有答案进行比较,以计算每个答案的分数。问题是每个问题都有大约1000个答案。每次考试最多有60个问题。 所有问题字段和回答字段都是布尔值。 问题和回答都是对象。 我该如何做才能加快速度并减少内存消耗PHP函数的优化,php,symfony,Php,Symfony,我有一个Symfony函数,需要很多优化。此函数用于将一个问题与其所有答案进行比较,以计算每个答案的分数。问题是每个问题都有大约1000个答案。每次考试最多有60个问题。 所有问题字段和回答字段都是布尔值。 问题和回答都是对象。 我该如何做才能加快速度并减少内存消耗 public function correctionReponseTest($question) { $reponses = $question->getReponses(); if ($question-&g
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的最简单的“自然关系”,这是行
,用于重复项而不是列。依我看,你没有足够的数据在台式电脑上引起性能问题。好吧,那我试试。我也认为这是一个更好的主意。我在圈外同花顺,它已经运行得更好了。谢谢