当前位置: 首页 > 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…...

开源流程编排引擎FlowCue:基于DAG与事件驱动的自动化工作流实践

1. 项目概述:FlowCue是什么,以及它为何值得关注如果你是一名开发者,尤其是经常和API、数据流、自动化任务打交道的后端或全栈工程师,那么你肯定对“流程编排”这个概念不陌生。简单来说,就是把一系列独立的操作&#x…...

小智聊天机器人的本地化部署。

前天到了,小智机器人ESP32-S2的套件(非焊接版的那一款),找王同学,学了学怎么焊接。昨天,使用面包板搭建电路,安装元器件,服务器端注册设置,刷程序,很快就完成…...

Linux驱动开发:原子操作实现LED设备互斥访问

1. 项目概述:用原子操作给LED驱动加把“锁”在嵌入式Linux开发里,驱动开发是绕不开的一环。很多时候,一个硬件设备,比如一个简单的LED灯,可能会被多个用户空间的应用程序同时访问。想象一下,一个APP想开灯&…...

msphpsql与现代化PHP框架集成指南:Laravel、Symfony等主流框架的完整配置方案

msphpsql与现代化PHP框架集成指南:Laravel、Symfony等主流框架的完整配置方案 【免费下载链接】msphpsql Microsoft Drivers for PHP for SQL Server 项目地址: https://gitcode.com/gh_mirrors/ms/msphpsql Microsoft Drivers for PHP for SQL Server&#…...

AutoHotkey V2扩展库:解决Windows自动化开发痛点的完整解决方案

AutoHotkey V2扩展库:解决Windows自动化开发痛点的完整解决方案 【免费下载链接】ahk2_lib 项目地址: https://gitcode.com/gh_mirrors/ah/ahk2_lib AutoHotkey V2扩展库ahk2_lib为Windows自动化开发提供了从简单脚本到专业应用的完整技术栈,通过…...

国产多模态大模型如何“看懂”三维世界?3D场景理解深度解析

国产多模态大模型如何“看懂”三维世界?3D场景理解深度解析 引言 在人工智能向物理世界进军的浪潮中,让机器理解我们身处的三维空间,已成为核心挑战与前沿阵地。与依赖二维图像的视觉识别不同,3D场景理解要求模型能融合视觉、几何…...

米尔RK3576开发板评测:工业AI与边缘计算的性能甜点方案

1. 项目概述:当RK3576遇上米尔开发板,工业AI的新选择最近在嵌入式圈子里,瑞芯微的RK3576这颗SoC讨论热度挺高。作为一枚常年混迹在工控、边缘计算和AIoT项目里的老工程师,我对这类新平台的发布总是格外敏感。米尔电子作为国内老牌…...

动力电池技术迭代:从能量密度到系统集成的多维竞争

1. 动力电池行业的“肌肉”意味着什么最近,行业里关于宁德时代又推出新产品的消息传得沸沸扬扬。作为在这个行业里摸爬滚打了十几年的老兵,每次看到这样的新闻,我的第一反应不是“又来了”,而是“这次他们想解决什么问题&#xff…...

国内热门的广州租车工厂哪个好

在广州,租车需求日益增长,如何选择一家靠谱的租车工厂成为众多消费者关心的问题。今天,就为大家介绍一家热门的租车企业——广州市白驹旅游汽车有限公司(简称白驹旅汽),并与其他大厂进行对比分析。车辆保障…...

终极指南:如何用MAA Assistant Arknights实现明日方舟全自动化

终极指南:如何用MAA Assistant Arknights实现明日方舟全自动化 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: htt…...