一次简单的优化问题
Posted koaler
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一次简单的优化问题相关的知识,希望对你有一定的参考价值。
先看一段效率极其低下的代码
startOne = System.currentTimeMillis(); if (titlelists != null && titlelists.size() > 0) { for (int i = 0; i < titlelists.size(); i++) { String titleid = titlelists.get(i).getTitleid(); titleMapper title = titleService.selectByPrimaryKey(titleid); String str = ""; if (title.getTitletype().equals("1")) { str = "单选题"; } if (title.getTitletype().equals("2")) { str = "多选题"; } if (title.getTitletype().equals("3")) { str = "不定项选择题"; } if (title.getTitletype().equals("4")) { str = "问答题"; } resultJson += "{ "titletype":"" + str + ""," + ""stem":"" + title.getStem() + "","questionbankid":""; resultJson += titlelists.get(i).getQuestionbankid() + "","titleid":""; resultJson += titlelists.get(i).getTitleid() + """; Long one = System.currentTimeMillis(); List<optionMapper> option = optionService.selectByTitleId(title.getTitleid()); System.out.println(i+":1:"+(System.currentTimeMillis()-one)); one = System.currentTimeMillis(); analyseMapper analyse = analyseService.selectByTitleId(title.getTitleid()); System.out.println(i+":2:"+(System.currentTimeMillis()-one)); one = System.currentTimeMillis(); answerMapper answer = answerService.selectByTitleId(title.getTitleid()); System.out.println(i+":3:"+(System.currentTimeMillis()-one)); one = System.currentTimeMillis(); resultJson += ","options":""; for (int k = 0; k < option.size(); k++) { if (option.get(k).getOptionnumber() == 1) { resultJson += "A:"; } if (option.get(k).getOptionnumber() == 2) { resultJson += "B:"; } if (option.get(k).getOptionnumber() == 3) { resultJson += "C:"; } if (option.get(k).getOptionnumber() == 4) { resultJson += "D:"; } resultJson += option.get(k).getOptionvalue() + "|"; } resultJson = resultJson.substring(0, resultJson.length() - 1); System.out.println(i+":4:"+(System.currentTimeMillis()-one)); one = System.currentTimeMillis(); resultJson += """; resultJson += ","answer":""; resultJson += answer.getAnswervalue(); resultJson += """; resultJson += ","analyse":""; resultJson += analyse.getAnalysevalue(); resultJson += "","; resultJson += """; resultJson += "titlenumber":""; resultJson += qbMapper.getTitlenumber() + "","inputanswer":""; resultJson += titlelists.get(i).getInputAnswer() + ""}"; System.out.println(i+":5:"+(System.currentTimeMillis()-one)); } } startTwo = System.currentTimeMillis(); System.out.println("拼接题目花费时间"+(startTwo-startOne));
这段代码,再titles有80个,执行了大概有18-20秒钟,等待太久了,
1 主要问题,在于,在for循环里面直接调用额数据库,额外的开销太大的了,应该把数据先一次性提取出来,再进行操作,
2 还有一个问题,拼接字符串不要用String,而是应该用StringBuilder【非线程安全情况下】,StringBuffer【线程安全情况下】
目前就是这两个地方可以进行优化,优化后的代码和时间,后续贴上来。
以上是关于一次简单的优化问题的主要内容,如果未能解决你的问题,请参考以下文章