代码优化 运行时间太长 求指出问题!

问题描述

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);去掉最后面一个后面因为出现了时间诡异的很长就换了没换过来了!
解决方案十三:
因为集合都不大长度都只有四五个吧

时间: 2024-09-26 22:23:13

代码优化 运行时间太长 求指出问题!的相关文章

用java编了个ACM问题,可是程序怎么都通不过因为运行时间太长!

问题描述 用java编了个ACM问题,可是程序怎么都通不过因为运行时间太长! 求改进啊!大神教教我,题目是HDU4883,百度也有 这是题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4883 下面是我的代码,求给建议!减少运行时间啊!跪求! import java.util.*; public class Main{ public static void main(String[] args) { Scanner sc=new Scanner(Sy

mysql-使用navicat premium打开oracle数据表时提示“内部缓冲区字符太长”

问题描述 使用navicat premium打开oracle数据表时提示"内部缓冲区字符太长" 使用navicat premium打开oracle数据表时提示"内部缓冲区字符太长",但在plsql里面是正常的: 使用navicat premium"数据传输"功能将oracle数据表导入到mysql时,oracle中number类型在mysql中默认为保留小数点后30位..怎样才能设置成不保留小数点呢不知道是怎么回事,求大神指教~~ 解决方案 直接

图片-jsp页面传参问题(参数长度太长)

问题描述 jsp页面传参问题(参数长度太长) < img src=""../admin/image-read.action?icode=${data.icode}""/> 其中icode是一个图片的二进制数据串,比较长,传不到后台.有什么其他方法? 解决方案 这个方式肯定不行啊,虽然没明白你是不是直接从前台获取一个本地图片然后在jsp中转成二进制的,但是这样肯定传不了的.可以使用ajax form提交提交后也不刷新当前页面. 解决方案二: jsp页面传到

Win7笔记本电脑开机时间太长了怎么办?

  Win7笔记本电脑开机时间太长了怎么办?        步骤一:需下载安装360安全卫士 1.打开360安全卫士,点击左下角的"优化加速"; 2.点击"开始扫描"(扫描默认选项:开机加速.系统加速.网络加速.硬盘加速); 3.等待扫描完成后点击"立即优化"; 4.优化最后步骤可能会弹出"一键优化提醒"窗口,我们点击窗口中的"全选",然后点击"确认优化". 步骤二: 1.点击开始菜单,

Ubuntu终端里面显示路径名称太长怎么修改?

  Ubuntu终端里面显示路径名称太长怎么修改?Ubuntu默认的终端下面,进入很多层的目录后,前面那个提示符会显示完整的路径,这样命令行太长,让人觉得不舒服,现在教大家一个方法修改一下使命令行只显示当前目录的最后一级目录名,这样看起来也好,用pwd可以看到完整的路径名. 1.找到配置文件先进行备份:cp ~/.bashrc ~/.bashrc-bak,找到配置文件修改:vi ~/.bashrc,备份是为了防止配置修改出错,可以还原; 2.下面是我的/home/vagrant/.bashrc,

电脑提示“无法访问此文件夹 路径太长”删不了怎么办

  除文件夹的时候发现出现了问题,一个文件夹老是删除不掉! 再仔细检查发现没有任何问题,但是就是莫名其妙的删除不掉.再一层一层检查,到最后发现双击文件夹后出现提示:无法访问此文件夹 路径太长. 看了其他人说的办法,其实都不是很好使,即使采用了360的文件粉碎机还是不能搞定!最后自己想了一个办法搞定了,解决办法其实非常简单的,下面告诉大家: 文件夹路径太长太深了,比如文件路径是A/B/C/D/F/G-. 那么,可以将中间某个环节开始的剪切掉,放到外面来,这样就类似于A/B/C/,然后D/F/G-.

DiscuzX提示:您当前的帐号已经太长时间未登录网站已经被冻结,必须验证邮箱后才能解除冻结状态

  有段时间没登录DiscuzX_3.2系列论坛,好多用户一登录就提示要验证账号: 您当前的帐号已经太长时间未登录网站已经被冻结,必须验证邮箱后才能解除冻结状态 好吧,作为管理员,批量给他们处理一下吧: 第一步:把后台,防灌水的,帐号保镖关掉 第二步:解冻会员 后台 -> 用户 -> 审核用户 -> 把用户"审核通过"即可.

autofocus-ios+zbar 自动对焦时间太长怎么处理?

问题描述 ios+zbar 自动对焦时间太长怎么处理? ios + zbar 扫描条码使用ZBarReaderViewControllercamera界面出来后 对焦很不清楚 需要2秒左右 才能对焦成功请问这个应该怎么设置 解决方案 打电话给IPHONE支持 解决方案二: 打电话给IPHONE支持

数字-求解C语言!代码不要太长!C++不太会

问题描述 求解C语言!代码不要太长!C++不太会 标题:神奇算式 由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成. 比如: 210 x 6 = 1260 8 x 473 = 3784 27 x 81 = 2187 都符合要求. 如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式. 请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式). 解决方案 http://zhidao.baidu.com/link?ur