问题描述
longstartTime=System.currentTimeMillis();//获取开始时间for(intk=0;k<titleTrees.size();k++)//二级目录即页面标题设置{longtreeStart=System.currentTimeMillis();//获取开始时间VstIndexJsonTreetitle=titleTrees.get(k);otherJsonBuffer.append("{");otherJsonBuffer.append(""name":""+title.getOptionValue(Constant.OPTION_NAME_ACTION)+"",");otherJsonBuffer.append(""view":{");otherJsonBuffer.append(""layoutName":"template_widget_1",");//标题位置设置otherJsonBuffer.append(""widgetName":"",");otherJsonBuffer.append(""items":[");List<VstIndexJsonTree>contextTrees=treeService.getTreeByParentId(title.getTreeId());for(inti=0;i<contextTrees.size();i++){VstIndexJsonTreecontextTree=contextTrees.get(i);otherJsonBuffer.append("{"type":1,");otherJsonBuffer.append(""idName":"template_p1",");//内容位置设置otherJsonBuffer.append(""tagName":"",");otherJsonBuffer.append(""video":"",");otherJsonBuffer.append(""image":""+contextTree.getOptionValue(Constant.OPTION_NAME_IMAGE)+"",");otherJsonBuffer.append(""text":""+GetJsonUtil.strEscapeJava(contextTree.getOptionValue(Constant.OPTION_NAME_TEXT))+"",");otherJsonBuffer.append(""bgDrawableName":""+contextTree.getOptionValue(Constant.OPTION_NAME_BGDRAWABLENAME)+"",");otherJsonBuffer.append(""drawableName":""+contextTree.getOptionValue(Constant.OPTION_NAME_DRAWABLENAME)+"",");otherJsonBuffer.append(""intent":{");otherJsonBuffer.append(""action":""+contextTree.getOptionValue(Constant.OPTION_NAME_ACTION)+"",");otherJsonBuffer.append(""key":""+contextTree.getOptionValue(Constant.OPTION_NAME_KEY)+"",");otherJsonBuffer.append(""value":""+contextTree.getOptionValue(Constant.OPTION_NAME_VALUE)+""");otherJsonBuffer.append("}");if(i==contextTrees.size()-1){otherJsonBuffer.append("}");}else{otherJsonBuffer.append("},");}}otherJsonBuffer.append("]}},");longtreeEnd=System.currentTimeMillis();//获取结束时间System.out.println("第"+k+"次循环"+title.getTreeId()+"所用时间:"+(treeEnd-treeStart)+"ms");}longendTime=System.currentTimeMillis();//获取结束时间System.out.println("程序运行总时间:"+(endTime-startTime)+"ms");是tomcat上一个servlet启动后第一次访问第0次循环85所用时间:24ms第1次循环86所用时间:21ms第2次循环87所用时间:18ms第3次循环88所用时间:15ms第4次循环89所用时间:20009ms总是这个时间很大第5次循环90所用时间:6ms程序运行总时间:20093ms第二次访问第0次循环85所用时间:12ms第1次循环86所用时间:7ms第2次循环87所用时间:20007ms总是这个时间很大第3次循环88所用时间:5ms第4次循环89所用时间:5ms第5次循环90所用时间:5ms程序运行总时间:20041ms第三次访问第0次循环85所用时间:20013ms总是这个时间很大第1次循环86所用时间:11ms第2次循环87所用时间:6ms第3次循环88所用时间:7ms第4次循环89所用时间:3ms第5次循环90所用时间:3ms程序运行总时间:20043ms之后访问每次等待的时间还是很长但是打印出来的时间都是短的第0次循环85所用时间:6ms第1次循环86所用时间:4ms第2次循环87所用时间:3ms第3次循环88所用时间:3ms第4次循环89所用时间:3ms第5次循环90所用时间:3ms程序运行总时间:22ms希望大家指出问题可能存在的地方一级解决的方案
解决方案
解决方案二:
你这个是循环嵌套,你那几句红色时间长,是数据多还是业务复杂?
解决方案三:
数据简单业务也一样的为了避免这个问题把ID打印出来了现在发现时间长短与数据无关倒是与第几次访问有关第一次访问id89的时间最长第二次相同的数据87的时间最长......每次重启一次tomcat上面重复
解决方案四:
otherJsonBuffer初始化的时候,设置一个较大的值;otherJsonBuffer复用,通过otherJsonBuffer.setLength(0)将其清空
解决方案五:
longstartTime=System.currentTimeMillis();//获取开始时间for(intk=0;k<titleTrees.size();k++)//二级目录即页面标题设置{longtreeStart=System.currentTimeMillis();//获取开始时间VstIndexJsonTreetitle=titleTrees.get(k);otherJsonBuffer.append("{");otherJsonBuffer.append(""name":""+title.getOptionValue(Constant.OPTION_NAME_ACTION)+"",");otherJsonBuffer.append(""view":{");otherJsonBuffer.append(""layoutName":"template_widget_1",");//标题位置设置otherJsonBuffer.append(""widgetName":"",");otherJsonBuffer.append(""items":[");List<VstIndexJsonTree>contextTrees=treeService.getTreeByParentId(title.getTreeId());for(inti=0;i<contextTrees.size();i++){VstIndexJsonTreecontextTree=contextTrees.get(i);otherJsonBuffer.append("{"type":1,");otherJsonBuffer.append(""idName":"template_p1",");//内容位置设置otherJsonBuffer.append(""tagName":"",");otherJsonBuffer.append(""video":"",");otherJsonBuffer.append(""image":""+contextTree.getOptionValue(Constant.OPTION_NAME_IMAGE)+"",");otherJsonBuffer.append(""text":""+GetJsonUtil.strEscapeJava(contextTree.getOptionValue(Constant.OPTION_NAME_TEXT))+"",");otherJsonBuffer.append(""bgDrawableName":""+contextTree.getOptionValue(Constant.OPTION_NAME_BGDRAWABLENAME)+"",");otherJsonBuffer.append(""drawableName":""+contextTree.getOptionValue(Constant.OPTION_NAME_DRAWABLENAME)+"",");otherJsonBuffer.append(""intent":{");otherJsonBuffer.append(""action":""+contextTree.getOptionValue(Constant.OPTION_NAME_ACTION)+"",");otherJsonBuffer.append(""key":""+contextTree.getOptionValue(Constant.OPTION_NAME_KEY)+"",");otherJsonBuffer.append(""value":""+contextTree.getOptionValue(Constant.OPTION_NAME_VALUE)+""");otherJsonBuffer.append("}");if(i==contextTrees.size()-1){otherJsonBuffer.append("}");}else{otherJsonBuffer.append("},");}}otherJsonBuffer.append("]}},");longtreeEnd=System.currentTimeMillis();//获取结束时间System.out.println("第"+k+"次循环"+title.getTreeId()+"所用时间:"+(treeEnd-treeStart)+"ms");}longendTime=System.currentTimeMillis();//获取结束时间System.out.println("程序运行总时间:"+(endTime-startTime)+"ms");
解决方案六:
优化1:intcount=titleTrees.size();for(intk=0;k<count;k++)
说明:如果titleTrees值越大,这里的性能越低。如果你不改这里,因为每一次循环都要计算一次titleTrees的大小,即size的值。
解决方案七:
contextTrees.size();这个地方也是同理的,就不在解释了
解决方案八:
因为需要反复使用每次开始都有otherJsonBuffer.setLength(0)中间操作大都是otherJsonBuffer.append(...)的每次花费的时间总超过预想太多循环里面第一次访问方法总是第4个花费时间最多第二次总是第2个花费时间最多....总是这样诡异的规律是不是忽略什么地方
解决方案九:
4L意思是for(intk=0;k<titleTrees.size();k++)每次循环都会去计算titleTrees.size()的值吗?这确实是个问题!
解决方案十:
优化3:if(i==contextTrees.size()-1){otherJsonBuffer.append("}");}else{otherJsonBuffer.append("},");}
你这个if可以优化这样写:otherJsonBuffer.append("},");
然后在内层循环结束,即外部,替换otherJsonBuffer的最后一个值。希望你能看明白我的意思
解决方案十一:
引用8楼qq_17848763的回复:
4L意思是for(intk=0;k<titleTrees.size();k++)每次循环都会去计算titleTrees.size()的值吗?这确实是个问题!
对的,这个集合越大,影响越大
解决方案十二:
懂的最开始时用的是otherJsonBuffer.deleteCharAt(otherJsonBuffer.length()-1);去掉最后面一个后面因为出现了时间诡异的很长就换了没换过来了!
解决方案十三:
因为集合都不大长度都只有四五个吧