如果一个项目的目录齐全的话,约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个数据库查询,速度见下图:

EngineerCMS优化算法从2.71s到38ms_golang这段代码处理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



}





优化后就没有查询数据库了。


效果如下:


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