我的任务是优化使用 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;
慕少森
莫回无
相关分类