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

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

在这里插入图片描述

判断后循环

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题

次数执行时间内存占用
10.0000151539528
20.0000171543376
30.0000151543280
40.0000151543280
50.0000161543280
60.0000161543280
70.0000171543280
80.0000381543280
90.0000171543280
100.0000151543280

某题型有20题

次数执行时间内存占用
10.0000261551272
20.0000251560240
30.0000261560656
40.0000271560656
50.0000271560656
60.0000441560656
70.0000261560656
80.0000271560656
90.0000261560656
100.0000261560656

某题型有50题

次数执行时间内存占用
10.0000801805832
20.0000781868048
30.0000761868464
40.0000771868464
50.0000851868464
60.0000781868464
70.0000841868464
80.0000871868464
90.0000881868464
100.0000831868464

每题题型数量不限

次数题型1执行时间题型1内存占用题型2执行时间题型2内存占用题型3执行时间题型3内存占用题型4执行时间题型4内存占用题型5执行时间题型5内存占用
10.00058423434880.00046027402960.00022628755200.00020232986000.0005063809024
20.00056923434880.00047027402960.00023928755200.00025332986000.0007373809024
30.00058428316560.00047232284640.00024433636880.00020337867680.0005584297192
40.00063728321040.00050632289120.00037133641360.00019237872160.0004924297640
50.00057128321040.00047932289120.00023433641360.00020337872160.0005024297640
60.00059428321040.00047532289120.00023533641360.00022637872160.0004914297640
70.00061228321040.00052932289120.00024133641360.00033837872160.0007854297640
80.00057928321040.00053832289120.00023933641360.00020337872160.0004844297640
90.00058823434880.00048327402960.00024128755200.00019032986000.0005063809024
100.00058928316560.00051632284640.00023933636880.00019337867680.0004914297192

循环内判断

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题

次数执行时间内存占用
10.0000161539504
20.0000151543352
30.0000151543256
40.0000171543256
50.0000161543352
60.0000161543256
70.0000171543256
80.0000161543256
90.0000141543256
100.0000161547072

某题型有20题

次数执行时间内存占用
10.0000271551248
20.0000261560216
30.0000371560632
40.0000271560632
50.0000251560632
60.0000261560632
70.0000281560632
80.0000261560632
90.0000261560632
100.0000271560632

某题型有50题

次数执行时间内存占用
10.0000941805808
20.0000791868024
30.0000811868440
40.0000801868440
50.0000761868440
60.0000811868440
70.0000781868440
80.0000891868440
90.0000791868440
100.0000871868440

每题题型数量不限

次数题型1执行时间题型1内存占用题型2执行时间题型2内存占用题型3执行时间题型3内存占用题型4执行时间题型4内存占用题型5执行时间题型5内存占用
10.00067623434800.00057327402880.00026628755120.00024632985920.0005783809016
20.00059028316320.00049832284400.00029333636640.00022037867440.0005664297168
30.00060828320800.00048932288880.00023133641120.00021337871920.0005414297616
40.00064328320800.00052632288880.00023633641120.00020837871920.0005364297616
50.00059028320800.00047832288880.00024433641120.00020537871920.0005784297616
60.00068228320800.00048932288880.00023733641120.00020937871920.0005634297616
70.00071328320800.00052632288880.00024133641120.00041637871920.0005124297616
80.00062123434640.00047727402720.00024028754960.00021232985760.0005143809000
90.00059628316320.00048932284400.00023433636640.00020537867440.0006244297168
100.00061228320800.00047232288880.00024833641120.00020737871920.0005264297616

函数内判断

$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题

次数执行时间内存占用
10.0000241537160
20.0000211541008
30.0000181540912
40.0000181540912
50.0000181537160
60.0000191541008
70.0000191540912
80.0000171540912
90.0000201540912
100.0000181540912

某题型有20题

次数执行时间内存占用
10.0000331548904
20.0000311557872
30.0000281558288
40.0000431558288
50.0000301558288
60.0000311558288
70.0000321558288
80.0000331558288
90.0000301558288
100.0000321558288

某题型有50题

次数执行时间内存占用
10.0000841803464
20.0000851865680
30.0000811866096
40.0001411866096
50.0000811866096
60.0001391866096
70.0000911866096
80.0000801803464
90.0000801865680
100.0000851803464

每题题型数量不限

次数题型1执行时间题型1内存占用题型2执行时间题型2内存占用题型3执行时间题型3内存占用题型4执行时间题型4内存占用题型5执行时间题型5内存占用
10.00064223411040.00052427379120.00044628731360.00023132962160.0005433806640
20.00063128292720.00051832260800.00043333613040.00022437843840.0005174294808
30.00062928297200.00050632265280.00023933617520.00021537848320.0006594295256
40.00060828297200.00049032265280.00025133617520.00022937848320.0005204295256
50.00064628297200.00053732265280.00024133617520.00023137848320.0008014295256
60.00061028297200.00049232265280.00024933617520.00023237848320.0005314295256
70.00064028297200.00048432265280.00025733617520.00030037848320.0005444295256
80.00058728297200.00050032265280.00038833617520.00022937848320.0005274295256
90.00065728297200.00061032265280.00024633617520.00022437848320.0007674295256
100.00060528297200.00049432265280.00024433617520.00022037848320.0005104295256

不同方法下数量不限时的平均值

方法题1时间题1内存题2时间题2内存题3时间题3内存题4时间题4内存题5时间题5内存
判断后循环0.00059072685429.60.00049283082237.60.00025093217461.60.00022033640541.60.00055524150965.6
循环内判断0.00063312734268.80.00050173131076.80.0002473266300.80.00023413689380.80.00055384199804.8
函数内判断0.00062552780813.60.00051553177621.60.00029943312845.60.00023353735925.60.00059194246349.6

结论

方法2题平均执行时间2题平均内存占用20题平均执行时间20题平均内存占用50题平均执行时间50题平均内存占用数量不限平均执行时间数量不限平均内存占用
判断后循环0.00001811542914.40.00002815596760.00008161862159.20.000421983355327.2
循环内判断0.00001581543281.60.000027515596520.00008241862135.20.000433943404166.4
函数内判断0.00001921540180.80.000032315573080.00009471847223.20.000453163450711.2

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

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

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/236118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在国产GPU寒武纪MLU上快速上手Pytorch使用指南

本文旨在帮助Pytorch使用者快速上手使用寒武纪MLU。以代码块为主,文字尽可能简洁,许多部分对标NVIDIA CUDA。不正确的地方请留言更正。本文不定期更新。 文章目录 前言Cambricon PyTorch的Python包torch_mlu导入将模型加载到MLU上model.to(mlu)定义损失函…

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞

20231220将NanoPC-T4(RK3399)开发板的Android10的SDK按照Rockchip官方挖掘机开发板编译打包刷机之后启动跑飞 2023/12/20 17:19 简略步骤:rootrootrootroot-X99-Turbo:~/3TB$ tar --use-compress-programpigz -xvpf rk3399-android-10.git-20210201.tgz rootrootro…

c++图像像素计算

我们知道每张图像都能够用矩阵来表示,矩阵中每个元素的值表示了图像中每个像素值,像素值的大小就对应着图像的亮暗。因此找到矩阵中的最大值,就是找到了图像中灰度值最大的像素,计算矩阵所有元素的平均值就是计算图像像素平均灰度…

feign遇到的问题

调用fegin接口报错: 请求地址/dept/findProjectDept,发生未知异常. org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet request; nested exception is java.lang.RuntimeException: java.io.IOException: UT000036: Connec…

递归算法:二叉树前序、中序、后序遍历解析与递归思想深度剖析

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《linux深造日志》 《高效算法》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、二叉树的遍历1.1 链式结构二叉树的创建1.1 二叉树结构图 二、 前序遍历代码演示:2.1 前序遍历递…

苏宁易购商品详情API:电商实时数据

一、引言 在当前的电商行业中,数据是最为宝贵的资源之一。如何获取实时、准确的数据,对于电商业务的运营和优化至关重要。作为中国领先的电商平台之一,苏宁易购提供了丰富的API接口,其中包括商品详情API,以便第三方开…

STL stack练习

CSTL之stack栈容器 - 数据结构教程 - C语言网CSTL之stack栈容器1.再谈栈回顾一下之前所学的栈,栈是一种先进后出的数据结构,而实现方式需要创建多个结构体,通过链式的方式进行实现,这是标准的栈的思路,而在STL中栈可以…

odoo17核心概念——env

env在odoo中是一个非常重要的概念,它是一个全局变量,保存了odoo运行环境的重要信息,env分为前端和后端 一、环境(env) 1、前端的env 在web\static\src\env.js中定义,包含两个重要的对象: 全局数据总线bus&#xff…

一键在线获取APP公钥、包名、签名及备案信息方法介绍

​ 目录 一键在线获取APP公钥、包名、签名及备案信息方法介绍 摘要 引言 一键获取APP包信息 操作步骤 ​编辑 解析报告 总结 致谢 关键词 参考资料 声明 摘要 本文介绍了一款在线APP解析工具,可以一键获取APP的公钥、包名、签名等基础信息,…

Python教程:对于初学者,几个易懂的装饰器示例用法

装饰器是Python中的一个高级功能,它可以用来扩展或修改一个函数或方法的功能,而不需要修改其原始代码。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个新的函数对象。 装饰器通常用于添加与函数功能无关的额外功能&a…

矩阵秩的公式小结

文章目录 矩阵秩的公式说明公式 矩阵秩的公式 说明 解释下了公式时,注意矩阵的行数列数由三秩相等原理,向量组的秩往往转换为矩阵的秩来研究 线性方程组 A x b \bold{Axb} Axb或 A X B \bold{AXB} AXB型方程有解定理 R ( A ) ⩽ R ( A , B ) R(\bold{A})\leqslant{R(\bold{…

java中IO与NIO有什么不同

目录 1. 阻塞与非阻塞 2. 缓冲区(Buffer) 3. 选择器(Selector) 4. 面向流与面向缓冲 5. 非阻塞IO Java中的IO(Input/Output)和NIO(New I/O)都是用于处理输入和输出的API&#x…

LeetCode 647回文子串 517最长回文子序列 | 代码随想录25期训练营day57

动态规划算法14 LeetCode 647 回文子串 2023.12.20 题目链接代码随想录讲解[链接] int countSubstrings(string s) {//暴力搜索&#xff0c;前两层遍历确定子字符串的起始和末尾位置//第三层循环判断当前子字符串是否为回文串/*int result 0;for (int i 0; i < s.size…

灰盒测试简要学习指南!

在本文中&#xff0c;我们将了解什么是灰盒测试、以及为什么要使用它&#xff0c;以及它的优缺点。 在软件测试中&#xff0c;灰盒测试是一种有用的技术&#xff0c;可以确保发布的软件是高性能的、安全的并满足预期用户的需求。这是一种从外部测试应用程序同时跟踪其内部操作…

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界

2023 英特尔On技术创新大会直播 | 窥探未来科技的边界 写在最前面观后感其他有趣的专题课程 写在最前面 嘿&#xff0c;你是不是对科技和创新充满好奇&#xff1f;2023 英特尔 On 技术创新大会线上活动邀请你一起探索最前沿的科技世界&#xff01; 这不仅是一场普通的聚会&…

golang开发--beego入门

Beego 是一个基于 Go 语言的开源框架&#xff0c;用于构建 Web 应用程序和 API。它采用了一些常见的设计模式&#xff0c;以提高开发效率、代码可维护性和可扩展性。 一&#xff0c;MVC设计模式 Beego 框架采用了经典的 MVC&#xff08;Model-View-Controller&#xff09;设计…

Linux 上Redis 升级

背景&#xff1a; 随着我Ruby on Rails 的版本升级&#xff0c;sidekiq的升级&#xff0c;我的redis已经不能很好的支持了&#xff0c;当我启动sidekiq时出现如下报错&#xff1a; redis-client requires Redis 6 with HELLO command available (redis://127.0.0.1:6379/0) 意…

程序员的23大IONIO面试问题及答案

文章目录 1. 什么是IO流&#xff1f;2.java中有几种类型的流&#xff1f;3.字节流和字符流哪个好&#xff1f;怎么选择&#xff1f;4.读取数据量大的文件时&#xff0c;速度会很慢&#xff0c;如何选择流&#xff1f;5. IO模型有几种&#xff1f;6.阻塞IO &#xff08;blocking…

如何用Excel制作一张能在网上浏览的动态数据报表

前言 如今各类BI产品大行其道&#xff0c;“数据可视化”成为一个热门词汇。相比价格高昂的各种BI软件&#xff0c;用Excel来制作动态报表就更加经济便捷。今天小编就将为大家介绍一下如何使用葡萄城公司的纯前端表格控件——SpreadJS来实现一个Excel动态报表&#xff1a; 实…

华为鸿蒙操作系统简介及系统架构分析(2)

接前一篇文章&#xff1a;华为鸿蒙操作系统简介及系统架构分析&#xff08;1&#xff09; 本文部分内容参考&#xff1a; 鸿蒙系统学习笔记(一) 鸿蒙系统介绍 特此致谢&#xff01; 上一回对于华为的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;进行了介绍并说明了其层次化…