十多年前开发框架时,为了效率不断试过各种代码写法,今天又遇到了,想想php8时代会不会有所变化,结果其实也还是和当年一样,但当年没写博客,但现在可以把数据记录下来了。
PHP_loop_ireflies_dark_forest
项目基本情况是一个考试系统调用题库后,根据是否需要随机出选项
和是否需要统一改分数
这两个条件,循环对每一道题的初始数据进行修改。我是从类的方法里直接截取的代码片段,所以代码部分只需懂意思即可,命名都很容易理解。
$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 |
基本和以前版本的结论一致:
- 在数量少的时候,
循环内判断
速度最快,函数内判断
内存占用最少;
- 在数量有所提升后,
判断后循环
速度最快,函数内判断
内存占用最少;
- 在数量上到一定量后,
判断后循环
速度最快,并且其内存占用也是最少。
如果字符量较少,不同方法所带来的损耗在一般应用中可以忽略;