我的任务是优化使用 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(">", "<")); express.replace(0, express.length(),express.toString().replaceAll("<", ">")); express.replace(0, express.length(),express.toString().replaceAll("'", "'")); express.replace(0, express.length(),express.toString().replaceAll("&", "&")); } if (express.length() > 1000) { express.replace(0, express.length(),express.toString().substring(0, 995) + "..." ); } table = "CALCULATION"; tableLoc = "CALCULATION"; inBrackets = false;
2 回答
慕少森
TA贡献2019条经验 获得超9个赞
是的,用 StringBuilder 替换字符串算术会对内存和性能产生影响。但是您的新代码仍然使用所有 toString().replaceAll 和 toString().split 和 toString().substring() 调用进行大量字符串运算。摆脱所有这些。它们都是昂贵的并且完全没有必要。
不要对字符串进行任何操作,而是在单个 StringBuilder 实例上进行所有操作。
至于内存不足,大多数这些字符串都是垃圾收集的,所以不清楚这会解决内存问题。但它肯定会改善情况。
莫回无
TA贡献1865条经验 获得超7个赞
请为上帝的爱变换
express = express.replaceAll("\\s", "");
express = express.replaceAll(">", "<");
express = express.replaceAll("<", ">");
express = express.replaceAll("'", "'");
express = express.replaceAll("&", "&");
进入
express = express.replace("\\s", "").replace(">", "<").replace("<", ">").replace("'", "'").replace("&", "&")
添加回答
举报
0/150
提交
取消