猿问

如果在 Java 中使用 toString 修改字符串时 StringBuilder 的效率

我的任务是优化使用 Cognos SDK 开发的应用程序,该应用程序在内容存储库中查询所有包,然后将它们写入 SQL 数据库。该应用程序由我的前任编写,并做了一些有趣的事情......它有几个我禁用的手动 system.GC 调用,以及一个循环中的 System.wait(2000)。它目前在服务器架构上运行速度要快得多,但如果尝试在普通客户端上运行它,它将由于堆错误而崩溃。所以深入挖掘,我发现里面有成吨的弦。显而易见的答案是更改为 StringBuilder,但如果我不得不在其中使用大量“toString”,我真的节省了内存吗?理论上,这些字符串运算符中的每一个都应该有一个方法,但是我 我有点不愿意弄乱应用程序上的一些逻辑,我不得不查找如何具体地做每一个。抱歉,如果之前有人问过这个问题,但是在环顾了一个小时后我找不到一个。


(顺便说一句:整个方法的认知复杂度为 174,但其中相当一部分是 cognos 特定的,我不知道从哪里开始减少它。)


这是我更改的示例(此循环在 ~450000 行输入上运行多次)。此外,我在 for 循环之前不久将“express”更改为初始值为“”的 StringBuilder,这是其中的一部分:


                        if (element.hasAttribute("expression") && element.getAttribute("expression") != "") {

                        formula = element.getAttribute("expression");

                        for (int k = 0; k < formula.length(); k++) {

                            if (formula.charAt(k) == '<')

                                exSearch++;

                            if (exSearch == 0)

                                express.append(formula.charAt(k));

                            if (formula.charAt(k) == '>')

                                exSearch--;

                        }


                        express.replace(0, express.length(),express.toString().replaceAll("\\s", ""));

                        express.replace(0, express.length(),express.toString().replaceAll("&gt;", "<"));

                        express.replace(0, express.length(),express.toString().replaceAll("&lt;", ">"));

                        express.replace(0, express.length(),express.toString().replaceAll("&apos;", "'"));

                        express.replace(0, express.length(),express.toString().replaceAll("&amp;", "&"));

                    }

                        if (express.length() > 1000) {

                        express.replace(0, express.length(),express.toString().substring(0, 995) + "..." );

                    }

                    table = "CALCULATION";

                    tableLoc = "CALCULATION";

                    inBrackets = false;


 

Helenr
浏览 149回答 2
2回答

慕少森

是的,用 StringBuilder 替换字符串算术会对内存和性能产生影响。但是您的新代码仍然使用所有 toString().replaceAll 和 toString().split 和 toString().substring() 调用进行大量字符串运算。摆脱所有这些。它们都是昂贵的并且完全没有必要。不要对字符串进行任何操作,而是在单个 StringBuilder 实例上进行所有操作。至于内存不足,大多数这些字符串都是垃圾收集的,所以不清楚这会解决内存问题。但它肯定会改善情况。

莫回无

请为上帝的爱变换&nbsp; express = express.replaceAll("\\s", "");&nbsp; express = express.replaceAll("&gt;", "<");&nbsp; express = express.replaceAll("&lt;", ">");&nbsp; express = express.replaceAll("&apos;", "'");&nbsp; express = express.replaceAll("&amp;", "&");进入express = express.replace("\\s", "").replace("&gt;", "<").replace("&lt;", ">").replace("&apos;", "'").replace("&amp;", "&")
随时随地看视频慕课网APP

相关分类

Java
我要回答