PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)

十多年前开发框架时,为了效率不断试过各种代码写法,今天又遇到了,想想php8时代会不会有所变化,结果其实也还是和当年一样,但当年没写博客,但现在可以把数据记录下来了。

PHP_loop_ireflies_dark_forest

项目基本情况是一个考试系统调用题库后,根据是否需要随机出选项和是否需要统一改分数这两个条件,循环对每一道题的初始数据进行修改。我是从类的方法里直接截取的代码片段,所以代码部分只需懂意思即可,命名都很容易理解。

  • $result 是数据库里提取的题库;
  • $score 是统一的题型分数(如果没有统一题型分数,那么每题都有自己不同的初始分);
  • $this->l_char->json_to_array() 是char字符类json转化为数组格式的方法;
  • $this->_random_option() 是随机化题目选项;
  • 目前题库共有3328题,每个题型所含题目数量不同;
  • PHP版本为8.1.3

为了保证尽量每种方法的实验数据在一个条件下,所以禁用随机出题,保证题目都一样,同时保证每题的选项都在随机变化。

PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)_第1张图片

判断后循环

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

基本和以前版本的结论一致:

  • 在数量少的时候,循环内判断速度最快,函数内判断内存占用最少;
  • 在数量有所提升后,判断后循环速度最快,函数内判断内存占用最少;
  • 在数量上到一定量后,判断后循环速度最快,并且其内存占用也是最少。

如果字符量较少,不同方法所带来的损耗在一般应用中可以忽略;

PHP开发日志——循环和条件语句嵌套不同,效率不同(循环内加入条件语句,条件语句判断后加入循环,array_map函数中加入条件语句)_第2张图片

你可能感兴趣的:(PHP,php,循环,条件语句,函数,array_map,效率,学习)