十多年前开发框架时,为了效率不断试过各种代码写法,今天又遇到了,想想php8时代会不会有所变化,结果其实也还是和当年一样,但当年没写博客,但现在可以把数据记录下来了。
项目基本情况是一个考试系统调用题库后,根据是否需要随机出选项
和是否需要统一改分数
这两个条件,循环对每一道题的初始数据进行修改。我是从类的方法里直接截取的代码片段,所以代码部分只需懂意思即可,命名都很容易理解。
$result
是数据库里提取的题库;$score
是统一的题型分数(如果没有统一题型分数,那么每题都有自己不同的初始分);$this->l_char->json_to_array()
是char字符类json转化为数组格式的方法;$this->_random_option()
是随机化题目选项;- 目前题库共有
3328题
,每个题型所含题目数量不同; - PHP版本为
8.1.3
为了保证尽量每种方法的实验数据在一个条件下,所以禁用随机出题,保证题目都一样,同时保证每题的选项都在随机变化。
判断后循环
if(!empty($score) and !empty($israndomoption))
{
foreach($result as $k=>$row)
{
$row['questionscore'] = $score;
$row['questionoption'] = $this->l_char->json_to_array($row['questionoption']);
$row['questionoption'] = $this->_random_option($row['questionoption']);
$result[$k] = $row;
}
}elseif(!empty($score)){
foreach($result as $k=>$row)
{
$row['questionscore'] = $score;
$result[$k] = $row;
}
}elseif(!empty($israndomoption)){
foreach($result as $k=>$row)
{
$row['questionoption'] = $this->l_char->json_to_array($row['questionoption']);
$row['questionoption'] = $this->_random_option($row['questionoption']);
$result[$k] = $row;
}
}
某题型有2题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000015 | 1539528 |
2 | 0.000017 | 1543376 |
3 | 0.000015 | 1543280 |
4 | 0.000015 | 1543280 |
5 | 0.000016 | 1543280 |
6 | 0.000016 | 1543280 |
7 | 0.000017 | 1543280 |
8 | 0.000038 | 1543280 |
9 | 0.000017 | 1543280 |
10 | 0.000015 | 1543280 |
某题型有20题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000026 | 1551272 |
2 | 0.000025 | 1560240 |
3 | 0.000026 | 1560656 |
4 | 0.000027 | 1560656 |
5 | 0.000027 | 1560656 |
6 | 0.000044 | 1560656 |
7 | 0.000026 | 1560656 |
8 | 0.000027 | 1560656 |
9 | 0.000026 | 1560656 |
10 | 0.000026 | 1560656 |
某题型有50题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000080 | 1805832 |
2 | 0.000078 | 1868048 |
3 | 0.000076 | 1868464 |
4 | 0.000077 | 1868464 |
5 | 0.000085 | 1868464 |
6 | 0.000078 | 1868464 |
7 | 0.000084 | 1868464 |
8 | 0.000087 | 1868464 |
9 | 0.000088 | 1868464 |
10 | 0.000083 | 1868464 |
每题题型数量不限
次数 | 题型1执行时间 | 题型1内存占用 | 题型2执行时间 | 题型2内存占用 | 题型3执行时间 | 题型3内存占用 | 题型4执行时间 | 题型4内存占用 | 题型5执行时间 | 题型5内存占用 |
---|
1 | 0.000584 | 2343488 | 0.000460 | 2740296 | 0.000226 | 2875520 | 0.000202 | 3298600 | 0.000506 | 3809024 |
2 | 0.000569 | 2343488 | 0.000470 | 2740296 | 0.000239 | 2875520 | 0.000253 | 3298600 | 0.000737 | 3809024 |
3 | 0.000584 | 2831656 | 0.000472 | 3228464 | 0.000244 | 3363688 | 0.000203 | 3786768 | 0.000558 | 4297192 |
4 | 0.000637 | 2832104 | 0.000506 | 3228912 | 0.000371 | 3364136 | 0.000192 | 3787216 | 0.000492 | 4297640 |
5 | 0.000571 | 2832104 | 0.000479 | 3228912 | 0.000234 | 3364136 | 0.000203 | 3787216 | 0.000502 | 4297640 |
6 | 0.000594 | 2832104 | 0.000475 | 3228912 | 0.000235 | 3364136 | 0.000226 | 3787216 | 0.000491 | 4297640 |
7 | 0.000612 | 2832104 | 0.000529 | 3228912 | 0.000241 | 3364136 | 0.000338 | 3787216 | 0.000785 | 4297640 |
8 | 0.000579 | 2832104 | 0.000538 | 3228912 | 0.000239 | 3364136 | 0.000203 | 3787216 | 0.000484 | 4297640 |
9 | 0.000588 | 2343488 | 0.000483 | 2740296 | 0.000241 | 2875520 | 0.000190 | 3298600 | 0.000506 | 3809024 |
10 | 0.000589 | 2831656 | 0.000516 | 3228464 | 0.000239 | 3363688 | 0.000193 | 3786768 | 0.000491 | 4297192 |
循环内判断
foreach ($result as $k => $row) {
if (!empty($score)) {
$row['questionscore'] = $score;
}
if (!empty($israndomoption)) {
$row['questionoption'] = $this->l_char->json_to_array($row['questionoption']);
$row['questionoption'] = $this->_random_option($row['questionoption']);
}
$result[$k] = $row;
}
某题型有2题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000016 | 1539504 |
2 | 0.000015 | 1543352 |
3 | 0.000015 | 1543256 |
4 | 0.000017 | 1543256 |
5 | 0.000016 | 1543352 |
6 | 0.000016 | 1543256 |
7 | 0.000017 | 1543256 |
8 | 0.000016 | 1543256 |
9 | 0.000014 | 1543256 |
10 | 0.000016 | 1547072 |
某题型有20题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000027 | 1551248 |
2 | 0.000026 | 1560216 |
3 | 0.000037 | 1560632 |
4 | 0.000027 | 1560632 |
5 | 0.000025 | 1560632 |
6 | 0.000026 | 1560632 |
7 | 0.000028 | 1560632 |
8 | 0.000026 | 1560632 |
9 | 0.000026 | 1560632 |
10 | 0.000027 | 1560632 |
某题型有50题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000094 | 1805808 |
2 | 0.000079 | 1868024 |
3 | 0.000081 | 1868440 |
4 | 0.000080 | 1868440 |
5 | 0.000076 | 1868440 |
6 | 0.000081 | 1868440 |
7 | 0.000078 | 1868440 |
8 | 0.000089 | 1868440 |
9 | 0.000079 | 1868440 |
10 | 0.000087 | 1868440 |
每题题型数量不限
次数 | 题型1执行时间 | 题型1内存占用 | 题型2执行时间 | 题型2内存占用 | 题型3执行时间 | 题型3内存占用 | 题型4执行时间 | 题型4内存占用 | 题型5执行时间 | 题型5内存占用 |
---|
1 | 0.000676 | 2343480 | 0.000573 | 2740288 | 0.000266 | 2875512 | 0.000246 | 3298592 | 0.000578 | 3809016 |
2 | 0.000590 | 2831632 | 0.000498 | 3228440 | 0.000293 | 3363664 | 0.000220 | 3786744 | 0.000566 | 4297168 |
3 | 0.000608 | 2832080 | 0.000489 | 3228888 | 0.000231 | 3364112 | 0.000213 | 3787192 | 0.000541 | 4297616 |
4 | 0.000643 | 2832080 | 0.000526 | 3228888 | 0.000236 | 3364112 | 0.000208 | 3787192 | 0.000536 | 4297616 |
5 | 0.000590 | 2832080 | 0.000478 | 3228888 | 0.000244 | 3364112 | 0.000205 | 3787192 | 0.000578 | 4297616 |
6 | 0.000682 | 2832080 | 0.000489 | 3228888 | 0.000237 | 3364112 | 0.000209 | 3787192 | 0.000563 | 4297616 |
7 | 0.000713 | 2832080 | 0.000526 | 3228888 | 0.000241 | 3364112 | 0.000416 | 3787192 | 0.000512 | 4297616 |
8 | 0.000621 | 2343464 | 0.000477 | 2740272 | 0.000240 | 2875496 | 0.000212 | 3298576 | 0.000514 | 3809000 |
9 | 0.000596 | 2831632 | 0.000489 | 3228440 | 0.000234 | 3363664 | 0.000205 | 3786744 | 0.000624 | 4297168 |
10 | 0.000612 | 2832080 | 0.000472 | 3228888 | 0.000248 | 3364112 | 0.000207 | 3787192 | 0.000526 | 4297616 |
函数内判断
$result = array_map(function ($row) use ($score, $israndomoption) {
if (!empty($score)) {
$row['questionscore'] = $score;
}
if (!empty($israndomoption)) {
$row['questionoption'] = $this->l_char->json_to_array($row['questionoption']);
$row['questionoption'] = $this->_random_option($row['questionoption']);
}
return $row;
}, $result);
某题型有2题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000024 | 1537160 |
2 | 0.000021 | 1541008 |
3 | 0.000018 | 1540912 |
4 | 0.000018 | 1540912 |
5 | 0.000018 | 1537160 |
6 | 0.000019 | 1541008 |
7 | 0.000019 | 1540912 |
8 | 0.000017 | 1540912 |
9 | 0.000020 | 1540912 |
10 | 0.000018 | 1540912 |
某题型有20题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000033 | 1548904 |
2 | 0.000031 | 1557872 |
3 | 0.000028 | 1558288 |
4 | 0.000043 | 1558288 |
5 | 0.000030 | 1558288 |
6 | 0.000031 | 1558288 |
7 | 0.000032 | 1558288 |
8 | 0.000033 | 1558288 |
9 | 0.000030 | 1558288 |
10 | 0.000032 | 1558288 |
某题型有50题
次数 | 执行时间 | 内存占用 |
---|
1 | 0.000084 | 1803464 |
2 | 0.000085 | 1865680 |
3 | 0.000081 | 1866096 |
4 | 0.000141 | 1866096 |
5 | 0.000081 | 1866096 |
6 | 0.000139 | 1866096 |
7 | 0.000091 | 1866096 |
8 | 0.000080 | 1803464 |
9 | 0.000080 | 1865680 |
10 | 0.000085 | 1803464 |
每题题型数量不限
次数 | 题型1执行时间 | 题型1内存占用 | 题型2执行时间 | 题型2内存占用 | 题型3执行时间 | 题型3内存占用 | 题型4执行时间 | 题型4内存占用 | 题型5执行时间 | 题型5内存占用 |
---|
1 | 0.000642 | 2341104 | 0.000524 | 2737912 | 0.000446 | 2873136 | 0.000231 | 3296216 | 0.000543 | 3806640 |
2 | 0.000631 | 2829272 | 0.000518 | 3226080 | 0.000433 | 3361304 | 0.000224 | 3784384 | 0.000517 | 4294808 |
3 | 0.000629 | 2829720 | 0.000506 | 3226528 | 0.000239 | 3361752 | 0.000215 | 3784832 | 0.000659 | 4295256 |
4 | 0.000608 | 2829720 | 0.000490 | 3226528 | 0.000251 | 3361752 | 0.000229 | 3784832 | 0.000520 | 4295256 |
5 | 0.000646 | 2829720 | 0.000537 | 3226528 | 0.000241 | 3361752 | 0.000231 | 3784832 | 0.000801 | 4295256 |
6 | 0.000610 | 2829720 | 0.000492 | 3226528 | 0.000249 | 3361752 | 0.000232 | 3784832 | 0.000531 | 4295256 |
7 | 0.000640 | 2829720 | 0.000484 | 3226528 | 0.000257 | 3361752 | 0.000300 | 3784832 | 0.000544 | 4295256 |
8 | 0.000587 | 2829720 | 0.000500 | 3226528 | 0.000388 | 3361752 | 0.000229 | 3784832 | 0.000527 | 4295256 |
9 | 0.000657 | 2829720 | 0.000610 | 3226528 | 0.000246 | 3361752 | 0.000224 | 3784832 | 0.000767 | 4295256 |
10 | 0.000605 | 2829720 | 0.000494 | 3226528 | 0.000244 | 3361752 | 0.000220 | 3784832 | 0.000510 | 4295256 |
不同方法下数量不限时的平均值
方法 | 题1时间 | 题1内存 | 题2时间 | 题2内存 | 题3时间 | 题3内存 | 题4时间 | 题4内存 | 题5时间 | 题5内存 |
---|
判断后循环 | 0.0005907 | 2685429.6 | 0.0004928 | 3082237.6 | 0.0002509 | 3217461.6 | 0.0002203 | 3640541.6 | 0.0005552 | 4150965.6 |
循环内判断 | 0.0006331 | 2734268.8 | 0.0005017 | 3131076.8 | 0.000247 | 3266300.8 | 0.0002341 | 3689380.8 | 0.0005538 | 4199804.8 |
函数内判断 | 0.0006255 | 2780813.6 | 0.0005155 | 3177621.6 | 0.0002994 | 3312845.6 | 0.0002335 | 3735925.6 | 0.0005919 | 4246349.6 |
结论
方法 | 2题平均执行时间 | 2题平均内存占用 | 20题平均执行时间 | 20题平均内存占用 | 50题平均执行时间 | 50题平均内存占用 | 数量不限平均执行时间 | 数量不限平均内存占用 |
---|
判断后循环 | 0.0000181 | 1542914.4 | 0.000028 | 1559676 | 0.0000816 | 1862159.2 | 0.00042198 | 3355327.2 |
循环内判断 | 0.0000158 | 1543281.6 | 0.0000275 | 1559652 | 0.0000824 | 1862135.2 | 0.00043394 | 3404166.4 |
函数内判断 | 0.0000192 | 1540180.8 | 0.0000323 | 1557308 | 0.0000947 | 1847223.2 | 0.00045316 | 3450711.2 |
基本和以前版本的结论一致:
- 在数量少的时候,
循环内判断
速度最快,函数内判断
内存占用最少; - 在数量有所提升后,
判断后循环
速度最快,函数内判断
内存占用最少; - 在数量上到一定量后,
判断后循环
速度最快,并且其内存占用也是最少。
如果字符量较少,不同方法所带来的损耗在一般应用中可以忽略;