EngineerCMS优化算法从2.71s到38ms

128 篇文章 0 订阅
72 篇文章 0 订阅
 如果一个项目的目录齐全的话,约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数据的时间吧。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值