当前位置: 首页 > news >正文

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

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

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

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

在这里插入图片描述

相关文章:

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

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

【Seata源码学习 】 扫描@GlobalTransaction注解 篇一

1. SeataAutoConfiguration 自动配置类的加载 基于SpringBoot的starter机制,在应用上下文启动时,会加载SeataAutoConfiguration自动配置类 # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfigurationio.seata.spring.boot.aut…...

DBA-MySql面试问题及答案-上

文章目录 1.什么是数据库?2.如何查看某个操作的语法?3.MySql的存储引擎有哪些?4.常用的2种存储引擎?6.可以针对表设置引擎吗?如何设置?6.选择合适的存储引擎?7.选择合适的数据类型8.char & varchar9.Mysql字符集10.如何选择…...

网络爬虫之Ajax动态数据采集

动态数据采集 规则 有时候我们在用 requests 抓取页面的时候,得到的结果可能和在浏览器中看到的不一样,在浏览器中可以看到正常显示的页面教据,但是使用 requests 得到的结果并没有,这是因为requests 获取的都是原始的 HTML 文档…...

c语言的初始学习(练习)

##初学c语言---MOOC浙江大学翁恺先生学习c语言 那么我们先看看这个题目吧,这是初始语法的应用。 记住,我们的程序是按步骤执行的,并不是在不同的两行同时进行。 程序设计:1.了解题目的需要,几个变量需要用到&#x…...

研究论文 2022-Oncoimmunology:AI+癌RNA-seq数据 识别细胞景观

Wang, Xin, et al. "Deep learning using bulk RNA-seq data expands cell landscape identification in tumor microenvironment." Oncoimmunology 11.1 (2022): 2043662. https://www.tandfonline.com/doi/full/10.1080/2162402X.2022.2043662 被引次数&#xff1…...

ChatGPT4与ArcGIS Pro3助力AI 地理空间分析和可视化及助力科研论文写作

在地学领域,ArcGIS几乎成为了每位科研工作者作图、数据分析的必备工具,而ArcGIS Pro3除了良好地继承了ArcMap强大的数据管理、制图、空间分析等能力,还具有二三维融合、大数据、矢量切片制作及发布、任务工作流、时空立方体等特色功能&#x…...

okhttp系列-一些上限值

1.正在执行的任务数量最大值是64 异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现runningAsyncCalls的数量大于等于64,就不从readyAsyncCalls取出任务执行。 public final class Dispatcher {private int …...

C++面向对象(OOP)编程-STL详解(vector)

本文主要介绍STL六大组件,并主要介绍一些容器的使用。 目录 1 泛型编程 2 CSTL 3 STL 六大组件 4 容器 4.1 顺序性容器 4.1.1 顺序性容器的使用场景 4.2 关联式容器 4.2.1 关联式容器的使用场景 4.3 容器适配器 4.3.1 容器适配器的使用场景 5 具体容器的…...

postman几种常见的请求方式

1、get请求直接拼URL形式 对于http接口,有get和post两种请求方式,当接口说明中未明确post中入参必须是json串时,均可用url方式请求 参数既可以写到URL中,也可写到参数列表中,都一样,请求时候都是拼URL 2&am…...

openai最新探索:超级对齐是否可行?

前言 今天来介绍一篇openai最新的paper:弱到强的对齐。 openai专门成立了一个团队来做大模型的超级对齐即superhuman model,之前chatgpt取得成功依赖RLHF即依赖人类反馈,但是作者期望的superhuman model将会是一个能够处理各种复杂问题的强…...

本地websocket服务端结合cpolar内网穿透实现公网访问

文章目录 1. Java 服务端demo环境2. 在pom文件引入第三包封装的netty框架maven坐标3. 创建服务端,以接口模式调用,方便外部调用4. 启动服务,出现以下信息表示启动成功,暴露端口默认99995. 创建隧道映射内网端口6. 查看状态->在线隧道,复制所创建隧道的公网地址加端口号7. 以…...

关于“Python”的核心知识点整理大全37

目录 13.6.2 响应外星人和飞船碰撞 game_stats.py settings.py alien_invasion.py game_functions.py ship.py 注意 13.6.3 有外星人到达屏幕底端 game_functions.py 13.6.4 游戏结束 game_stats.py game_functions.py 13.7 确定应运行游戏的哪些部分 alien_inva…...

Vivado中的FFT IP核使用(含代码)

本文介绍了Vidado中FFT IP核的使用,具体内容为:调用IP核>>配置界面介绍>>IP核端口介绍>>MATLAB生成测试数据>>测试verilogHDL>>TestBench仿真>>结果验证>>FFT运算。 1、调用IP核 该IP核对应手册pg109_xfft.pd…...

​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化

2022年亚马逊云科技re:Invent盛会于近日在拉斯维加斯成功召开,吸引了众多业界精英和创新者。亚马逊云科技边缘服务副总裁Jan Hofmeyr在演讲中分享了关于亚马逊云科技海外服务器边缘计算的最新发展和创新成果,引发与会者热烈关注。 re:Invent的核心主题是…...

什么是“人机协同”机器学习?

“人机协同”(HITL)是人工智能的一个分支,它同时利用人类智能和机器智能来创建机器学习模型。在传统的“人机协同”方法中,人们会参与一个良性循环,在其中训练、调整和测试特定算法。通常,它的工作方式如下…...

数学建模笔记-拟合算法

内容:拟合算法 一.概念: 拟合的结果就是找到一个确定的曲线 二.最小二乘法: 1. 2.最小二乘法的二表示的是平方的那个2 3.求解最小二乘法: 三.评价拟合的好坏 1.总体评分和SST: 2.误差平方和SSE: 3.回…...

非线性约束的优化问题_序列二次规划算法代码

1. 理论部分 2. 序列二次规划算法代码及解析 3.完整代码 1.理论部分 a.约束优化问题的极值条件 库恩塔克条件(Kuhn-Tucker conditions,KT条件)是确定某点为极值点的必要条件。如果所讨论的规划是凸规划,那么库恩-塔克条件也是充分条件。 &#xff…...

【数据结构之顺序表】

数据结构学习笔记---002 数据结构之顺序表1、介绍线性表1.1、什么是线性表? 2、什么是顺序表?2.1、概念及结构2.2、顺序表的分类 3、顺序表接口的实现3.1、顺序表动态存储结构的Seqlist.h3.1.1、定义顺序表的动态存储结构3.1.2、声明顺序表各个接口的函数 3.2、顺序表动态存储…...

junit-mock-dubbo

dubbo单元测试分两种情况 Autowired注解是启动上下文环境,使用上下文对象进行测试,适合调试代码 InjectMocks注解是启动上下文环境,使用mock对象替换上下文对象,适合单元测试 BaseTest *** Created by Luohh on 2023/2/10*/ S…...

浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)

✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

什么是库存周转?如何用进销存系统提高库存周转率?

你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

网站指纹识别

网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

手机平板能效生态设计指令EU 2023/1670标准解读

手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...