为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Helenr 2021-05-31 18:51:05
我的任务是优化使用 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; 
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

是的,用 StringBuilder 替换字符串算术会对内存和性能产生影响。但是您的新代码仍然使用所有 toString().replaceAll 和 toString().split 和 toString().substring() 调用进行大量字符串运算。摆脱所有这些。它们都是昂贵的并且完全没有必要。

不要对字符串进行任何操作,而是在单个 StringBuilder 实例上进行所有操作。

至于内存不足,大多数这些字符串都是垃圾收集的,所以不清楚这会解决内存问题。但它肯定会改善情况。


查看完整回答
反对 回复 2021-06-02
?
莫回无

TA贡献1865条经验 获得超7个赞

请为上帝的爱变换


  express = express.replaceAll("\\s", "");

  express = express.replaceAll("&gt;", "<");

  express = express.replaceAll("&lt;", ">");

  express = express.replaceAll("&apos;", "'");

  express = express.replaceAll("&amp;", "&");

进入


express = express.replace("\\s", "").replace("&gt;", "<").replace("&lt;", ">").replace("&apos;", "'").replace("&amp;", "&")



查看完整回答
反对 回复 2021-06-02
  • 2 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信