node和go的列表转树形, 执行速度测试对比

保证数据一致性,先生成4000条json数据到本地,然后分别读取文本执行处理

node代码

node是用midway框架

forNum1:number = 0forNum2:number = 0//执行测试async index(){// 生成菜单列表// const menuList = await this.generateMenuList([], 4000);const menuListStr = 	fs.readFileSync(this.app.getAppDir()+'/public/listJson.txt', 'utf8');const menuList = JSON.parse(menuListStr)console.time("4000条 引用类型 时间:deepTree");await this.deepTree(menuList);console.log("4000条 引用类型 时间:")console.timeEnd("4000条 引用类型 时间:deepTree");console.log("循环次数",this.forNum1)// this.logger.info("deepTree 数据", JSON.stringify(l));console.time("4000条 递归 时间:deepTree2");await this.deepTree2(menuList, null);console.timeEnd("4000条 递归 时间:deepTree2");console.log("循环次数",this.forNum2)}// 列表转树形async deepTree(list: any[]){const newList: any[] = [];const map: any = {};for (let index = 0; index < list.length; index++) {this.forNum1++const e = list[index];map[e.id] = e;}for (let index = 0; index < list.length; index++) {this.forNum1++const e = list[index];const parent = map[e.parentId];if (parent) {(parent.children || (parent.children = [])).push(e);} else {newList.push(e);}}return newList;}// 递归遍历async deepTree2(arr: any[], parentId: any) {// const loop = (parentId: any) => {//   return arr.reduce((pre, cur) => {//     this.forNum2++//     if (cur.parentId == parentId) {//       cur.children = loop(cur.id);//       pre.push(cur);//     }//     return pre;//   }, []);// }const list = []const loop = (parentId: any)=>{for (let index = 0; index < arr.length; index++) {this.forNum2++if (arr[index].parentId == parentId) {arr[index].children = loop(arr[index].id);list.push(arr[index]);}}return list}return loop(parentId);}//生成随机的菜单列表数据,给转换树形菜单使用async generateMenuList(menuList: { id: number; parentId: number | null }[] = [],maxDepth: number = 5){// 如果菜单列表长度达到1000,则停止生成if (menuList.length > maxDepth || menuList.length >= 10000) {return menuList;}const nextID = menuList.length + 1// 如果菜单列表不为空,则随机选择一个已存在的id作为parentId;否则parentId为nulllet parentId: number | null = null;if (menuList.length > 0) {parentId = menuList[Math.floor(Math.random() * menuList.length)].id;}// 将新菜单项添加到列表中menuList.push({ id:nextID, parentId });// 递归调用生成子菜单项,深度加1return this.generateMenuList( menuList, maxDepth);}

测试结果
在这里插入图片描述

go代码

go框架是goframe

var (ctx     context.ContextforNum1 = 0forNum2 = 0
)type MenuItem struct {ID       *int        `json:"id"`       // 节点的唯一标识符ParentId *int        `json:"parentId"` // 父节点的IDChildren []*MenuItem `json:"children"` // 子节点列表
}
// 遍历树
func DeepTree(strSlice []*MenuItem) interface{} {var (strMap  = make(map[int]*MenuItem)newList []*MenuItem)for i := range strSlice {node := strSlice[i]strMap[*node.ID] = nodeforNum1++}for i := range strSlice {node := strSlice[i]if *node.ParentId != 0 {strMap[*node.ParentId].Children = append(strMap[*node.ParentId].Children, node)} else {newList = append(newList, node)}forNum1++}return newList
}// 执行递归
func DeepTree2(strSlice []*MenuItem, parentId int) interface{} {var (loop func([]*MenuItem, int) []*MenuItemlist []*MenuItem)loop = func(strSlice []*MenuItem, parentId int) []*MenuItem {for i := range strSlice {forNum2++if parentId == 0 {if *(strSlice[i].ParentId) == 0 {strSlice[i].Children = loop(strSlice, *(strSlice[i].ID))list = append(list, strSlice[i])}} else if *(strSlice[i].ParentId) != 0 && *(strSlice[i].ParentId) == parentId {strSlice[i].Children = loop(strSlice, *(strSlice[i].ID))list = append(list, strSlice[i])}}return list}return loop(strSlice, parentId)
}// 生成随机菜单列表数据
func generateMenuList(menuList []*MenuItem, maxDepth int) []*MenuItem {// 如果菜单列表长度达到10000,则停止生成if len(menuList) >= maxDepth || len(menuList) >= 10000 {return menuList}nextID := len(menuList) + 1// 如果菜单列表不为空,则随机选择一个已存在的id作为parentId;否则parentId为nilvar parentId intif len(menuList) > 0 {existingItem := menuList[rand.Intn(len(menuList))]parentId = *(existingItem.ID)}// 将新菜单项添加到列表中menuList = append(menuList, &MenuItem{ID: &nextID, ParentId: &parentId})// 递归调用生成子菜单项,深度加1return generateMenuList(menuList, maxDepth)
}

开始测试

func Test(t *testing.T) {var (menuSlice []*MenuItem)//menuSlice = generateMenuList([]*MenuItem{}, 15)//gfile.PutContents("./listJson-15.txt", gconv.String(menuSlice))jsonStr := gfile.GetContents("./listJson-4000.txt")err := gconv.Scan(jsonStr, &menuSlice)if err != nil {return}startTime1 := time.Now()DeepTree(menuSlice)endTime1 := time.Now()logInfo1 := fmt.Sprintf("\n %d条 引用类型 时间:%v,循环次数:%d\n--------", len(menuSlice), endTime1.Sub(startTime1), forNum1)g.Log().Debug(ctx, logInfo1)startTime2 := time.Now()DeepTree2(menuSlice)endTime2 := time.Now()logInfo2 := fmt.Sprintf("\n %d条 引用类型 时间:%v,循环次数:%d\n--------", len(menuSlice), endTime2.Sub(startTime2), forNum2)g.Log().Debug(ctx, logInfo2)}

测试结果:
在这里插入图片描述

测试连续10次的数据
在这里插入图片描述

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

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

相关文章

双周总结#008 - AIGC

本周参与了公司同事对 AIGC 的分享会&#xff0c;分享了 AIGC 在实际项目中的实践经验&#xff0c;以及如何进行 AIGC 的落地。内容分几项内容&#xff1a; 什么是 AIGCAIGC 能做什么AIGC 工具 以年终总结为例&#xff0c;分享了哪些过程应用了 AIGC&#xff0c;以及 AIGC 落地…

QA测试开发工程师面试题满分问答19: url请求到响应整个过程,涉及到什么技术细节

概述 当你点击鼠标发起一个请求&#xff0c;直到页面显示响应数据&#xff0c;整个过程可以详细展开为以下步骤&#xff1a; 用户点击鼠标&#xff1a;用户在浏览器中点击某个链接或按钮&#xff0c;触发请求的发起。 URL 解析&#xff1a;浏览器解析点击的链接中的 URL&…

在线音乐播放网站项目测试(selenium+Junit5)

在做完在线音乐播放网站项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#…

下列程序定义了NxN的二维数组,并在主函数中自动赋值。请编写函数fun(int a[][N],int n),该函数的功能是:使数组右上半三角元素中的值乘以m。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 下列…

【QML】State组件

State(状态)组件是一组来自默认配置的批处理更改。所有项都有一个默认状态&#xff0c;该状态定义对象和属性值的默认配置。可以通过将State项添加到states属性来定义新的状态&#xff0c;以允许项在不同的配置之间切换。 State组件的基本用法如下&#xff1a; Window {id: …

【ARM Trace32(劳特巴赫) 使用介绍 12.1 -- Trace32 读写 64位地址】

请阅读【Trace32 ARM 专栏导读】 文章目录 Trace32 读写 64位地址读 64 位地址写64位地址Trace32 读写 64位地址 在使用TRACE32进行调试时,有时需要读取或操作64位的地址,特别是在处理64位的处理器或操作系统时。以下是如何在TRACE32中读取64位地址的一般方法。 读 64 位地…

MySQL行级锁——技术深度+1

引言 本文是对MySQL行级锁的学习&#xff0c;MySQL一直停留在会用的阶段&#xff0c;需要弄清楚锁和事务的原理并DEBUG查看。 PS:本文涉及到的表结构均可从https://github.com/WeiXiao-Hyy/blog中获取&#xff0c;欢迎Star&#xff01; MySQL行级锁 行级锁&#xff08;Row-…

js连接抖音打印组件实现打印

js连接抖音打印组件实现打印小票 安装抖音打印组件 抖音打印组件文档&#xff1a; https://bytedance.larkoffice.com/docs/doccn2vbOOdd3KWrCd6Z93nIlvg 跟着文档案例一步步配基本上没问题&#xff0c; 打印的时候需要设置下打印机名称 export class DouyinPrint {construct…

怎么理解算力?1000P算力是什么概念?

算力&#xff0c;指计算机系统在单位时间内能够完成的计算任务量&#xff0c;它涵盖了CPU、GPU、TPU等硬件&#xff0c;每秒能处理的数据量&#xff0c;通常以“P”&#xff08;PetaFLOPS&#xff0c;即千万亿次浮点运算每秒&#xff09;为单位来衡量&#xff0c;是评估计算机性…

PDF被加密无法打印的解决办法

思路很清晰&#xff1a;先解密→再打印 分享四个工具&#xff0c;可以轻松解密PDF&#xff1a; ⭐i love pdf I LOVE PDF是一款免费的PDF网站&#xff0c;界面设计简洁&#xff0c;首页没有广告&#xff0c;但每个功能的操作界面是有广告的&#xff0c;不会影响使用。 部分功…

大数据开发详解

点击下载《大数据开发详解》 1. 前言 随着信息化时代的快速发展&#xff0c;大数据已经成为了企业和组织不可或缺的重要资源。大数据开发则是指通过一系列技术手段&#xff0c;对海量数据进行收集、存储、处理、分析和挖掘&#xff0c;以实现数据的价值化利用。大数据开发涉及…

剑指offer--调整数字顺序使奇数位于偶数前面

题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有的偶数位于数组的后半部分. 算法分析 算法:利用快速排序的一次划分思想&#xff0c;后面的奇数往前移&#xff0c;前面的偶数往后移 时间复杂度 &#xff1a;O(n) 空间…

垃圾渗滤液如何有效处理

垃圾渗滤液&#xff0c;通常称为垃圾填埋场的渗滤液&#xff0c;是一种复杂的高浓度有机废水&#xff0c;含有多种有毒有害物质。有效处理垃圾渗滤液对环境保护至关重要。这里是一些常见且有效的处理方法&#xff1a; ### 预处理 ##### 1. 调节池 - **pH调整**&#xff1a;通过…

JavaWeb开发06-原理-Spring配置优先级-Bean管理-SpringBoot原理-Maven继承和聚合-私服

一、Spring配置优先级 不同配置文件&#xff0c;配置同一个属性谁有效 properties>yml>yaml 命令行参数>Java系统属性 项目打包后要改变属性&#xff1a; 红色是Java系统属性&#xff0c;绿色是命令行参数 ‘ 二、Bean管理 1.获取bean 获取IOC容器&#xff1a;ap…

中国1KM降水侵蚀因子R(2000-2022)

降雨侵蚀力因子其实是用来描述降雨对土壤侵蚀的潜在能力大小的&#xff0c;就是降雨的冲刷对土壤的侵蚀效应。 到降雨侵蚀力因子R的计算方法非常的繁多&#xff0c;不过这些计算方法总结下来&#xff0c;核心思路其实大概可以分为两种&#xff1a;一种是将降雨的动能引入模型来…

【数据结构-串-数组-广义表】

目录 1 串-理解1.1 串的抽象定义&#xff1a;-理解1.2 串的存储结构-不断掌握1.2.1 顺序存储结构&#xff1a;1.2.2 链式存储结构&#xff1a; 1.3 串的模式匹配算法&#xff1a;-掌握1.3.1 BF暴力求解算法-代码 -掌握1.3.2 KMP求解算法-代码--掌握 2 数组-不断掌握2.1 顺序存储…

计算机网络3——数据链路层5高速以太网

文章目录 一、100BASE-T 以太网二、吉比特以太网三、10吉比特以太网(10GbE)和更快的以太网四、使用以太网进行宽带接入 随着电子技术的发展&#xff0c;以太网的速率也不断提升。从传统的10Mbits以太网一直发展到现在常用的速率为1Gbits的吉比特以太网&#xff0c;甚至更快的以…

Java中的super

package day33; ​ public class Person {public String name;public int age; ​public Person() {System.out.println("调用了父类的无参构造");} } ​ package day33; ​ public class teacher extends Person{public teacher() {System.out.println("调用了…

为什么iPhone支持整页中文OCR应用很少?有什么好的解决方法?

iPhone上面没有支持中文整页OCR识别的app&#xff0c;这是一个值得探讨的问题。OCR&#xff0c;即光学字符识别&#xff0c;是一种将纸质文档或图片中的文字转化为可编辑文本的技术。随着科技的发展&#xff0c;OCR技术已经广泛应用于各个领域&#xff0c;包括文档处理、图像识…

Python | Leetcode Python题解之第44题通配符匹配

题目&#xff1a; 题解&#xff1a; class Solution:def isMatch(self, s: str, p: str) -> bool:def allStars(st: str, left: int, right: int) -> bool:return all(st[i] * for i in range(left, right))def charMatch(u: str, v: str) -> bool:return u v or v…