标签:eval length equals answer ima 直接 数据 额外 start
先看一段效率极其低下的代码
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【线程安全情况下】
目前就是这两个地方可以进行优化,优化后的代码和时间,后续贴上来。
标签:eval length equals answer ima 直接 数据 额外 start
原文地址:https://www.cnblogs.com/Koaler/p/12215074.html