EngineerCMS优化算法从2.71s到38ms

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/details/55805633

 如果一个项目的目录齐全的话,约4320个目录。比如阶段划分上,6个阶段,下级专业划分,9个专业,再下级文档类型方面划分,约8种,再下级,建筑物分类,约10种,连乘下来就是4320个,这么多数据构造成一个树状目录,即嵌套的json数据,不能通过频繁的数据库查询来做。比如开始的时候,代码是通过查询数据库来判断是否有下级:

//递归构造项目树状目录
func walk(id int64, node *FileNode) {
 //列出当前id下子节点,不要列出孙节点……
    files, err := models.GetProjSonbyId(id)
 if err != nil {
        beego.Error(err)
    }
 // 遍历目录
 for _, proj := range files {
        id := proj.Id
        title := proj.Title
        code := proj.Code
 // 将当前名和id作为子节点添加到目录下
        child := FileNode{id, title, code, []*FileNode{}}
        node.FileNodes = append(node.FileNodes, &child)
 // 如果遍历的当前节点下还有节点,则进入该节点进行递归
 if models.Projhasson(proj.Id) {
            walk(proj.Id, &child)
        }
    }
 return
}

 里面使用了2个数据库查询,速度见下图:

这段代码处理4320个数据花了2.71s,导致整个页面响应时间达到5.23s. 优化思路,一次性把所有数据都取出来,利用程序循环处理,而不是频繁查询数据库。

//递归构造项目树状目录
func maketreejson(cates, categories []*models.Project, node *FileNode) {
 // 遍历目录
 for _, proj := range cates {
        id := proj.Id
        title := proj.Title
        code := proj.Code
 // 将当前名和id作为子节点添加到目录下
        child := FileNode{id, title, code, []*FileNode{}}
        node.FileNodes = append(node.FileNodes, &child)
        slice := getsons(id, categories)
 // 如果遍历的当前节点下还有节点,则进入该节点进行递归
 if len(slice) > 0 {
            maketreejson(slice, categories, &child)
        }
    }
 return
}
//取得数组的下级目录
func getsons(idNum int64, categories []*models.Project) (slice []*models.Project) {
 // slice := make([]*models.Project, 0)
 for _, k := range categories {
 if k.ParentId == idNum {
            slice = append(slice, k)
        }
    }
 return slice
}

优化后就没有查询数据库了。 效果如下:

从2.71s降到38ms,但是页面响应时间还是超过了0.5s,达到1.03s。猜测应该是treeview加载这个json数据的时间吧。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏玄魂工作室

看代码学渗透 Day5 - escapeshellarg与escapeshellcmd使用不当

--------------------------------------------------------------------------------...

3242
来自专栏人工智能LeadAI

mongoDB的安装及基本使用

mongoDB简介 1、NoSQL数据库 数据库:进行高效的、有规则的进行数据持久化存储的软件 NoSQL数据库:Not only sql,指代非关系型数据库...

3038
来自专栏Python攻城狮

mongoDB的安装及基本使用1.mongoDB简介2.MySQL的安装3.Mongodb下载安装3.安装pymongo4.Mongodb基本使用5.

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

2563
来自专栏xcywt

《Linux命令行与shell脚本编程大全》第十九章 初识sed和gawk

这两个工具能够极大简化需要进行的数据处理任务。 19.1 文本处理 能轻松实现自动格式化、插入、修改或删除文本元素的简单命令行编辑。 sed和gawk就具备上述...

2105
来自专栏CDA数据分析师

学会这几招,轻松掌握Python文件管理

一、Python中的文件管理 文件管理是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。 以下,Peyton ...

3036
来自专栏Python私房菜

60行Python代码,实现多线程PDF转Word

工作中经常会遇到需要提取PDF文件中文字的情况,一个PDF还好,复制粘贴一下也花不了太多时间,如果需要把大量PDF转为Word,怎么办呢?

1503
来自专栏FreeBuf

HTTP认证的底层技术简析与揭秘

写在前面的话 HTTP认证实现的基础是Web服务器与浏览器之间能够安全地交换类似用户名和密码这样的用户凭证,我们也可以把HTTP认证当作是摘要验证(Digest...

2099
来自专栏文渊之博

如何使用Python读取大文件

背景 最近处理文本文档时(文件约2GB大小),出现memoryError错误和文件读取太慢的问题,后来找到了两种比较快Large File Reading 的方...

78612
来自专栏程序员的知识天地

Python实现一个代码行数统计工具

我们经常想要统计项目的代码行数,但是如果想统计功能比较完善可能就不是那么简单了, 今天我们来看一下如何用python来实现一个代码行统计工具。

2051
来自专栏技术墨客

Guava CacheBuilder使用说明 原

CacheBuilder是Guava用于创建LoadingCache、Cache实例的构建类。可以使用下面的方法来创建一个Cache实例。

1325

扫码关注云+社区

领取腾讯云代金券