一次简单的优化问题

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【线程安全情况下】

  目前就是这两个地方可以进行优化,优化后的代码和时间,后续贴上来。

以上是关于一次简单的优化问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 反转句子中的每个单词需要对我的代码片段进行代码优化

如何优化C ++代码的以下片段 - 卷中的零交叉

如何在片段着色器中平铺部分纹理

防止 ViewPager 破坏屏幕外视图

从JVM的角度看JAVA代码--代码优化

GCC优化技巧,真的有用吗?