为什么我的coldfusion代码现在在字符串处理上快了100倍?

 lty燕_654 发布于 2023-02-08 19:58

所以,正如我的标题所说,我有一个ColdFusion程序,过去需要10分钟才能在我们的服务器上运行,但现在运行时间 <15秒.很困惑为什么这么简单的程序需要10分钟我和我的老板检查它以找出culprit导致速度减慢的代码部分.我们最终让它从10分钟5-10秒运行.

现在我们不确定为什么修复是一个修复,所以我们想知道是否有人可以向我们解释为什么/如何工作,以便我们可以理解修复,以便我们可以在其他程序中利用加速.

这个程序的开始是抓住查询〜4800条记录(没有离谱),然后我们遍历这些记录,我们想通了就是慢一节.这是我们所拥有的一个粗略的例子,以及我们为解决它所做的工作.TextString在查询附近的顶部设置为我们返回的字段的标题.

旧代码:


               

固定代码:


    
    
    

barnyr.. 21

由于字符串在CF中连接的方式,您的代码几乎肯定更快.虽然我不知道CF的确切内部,但我怀疑Strings是不可改变的.这意味着每次使用&将一个额外的变量连接到String时,它将创建一个新的String,它包含旧的String和最后的新字符串.要做到这一点,它必须分配内存,随着字符串的增长,内存越来越多.

每个循环中都有8个变量被添加到循环中,包括String的先前版本,所以你在循环期间分配~4800*8个字符串.

假设每行长度为35个字符,则字符串的最终大小为168k.这意味着它在运行期间的平均尺寸是:84k.现在,请记住,你要分配4800*8倍的字符串,你使用多达3 GIG(4800*8*8400)的内存来创建168k的输出.这意味着Java必须完成一大堆垃圾收集和额外的工作来为您的代码提供服务.

你的更新代码正在使用LocalTextString 7次中的7次,相比之下它会很小,所以你将获得相当大的速度提升.

试试这个版本:




  
  
  
   
  
   


它构建了一个字符串数组,然后在最后将它们转换为一个字符串.你也可以从Java看一下StringBuffer,它做同样的事情.当我上次查看它时,上面的Array/List方法速度最快,但那是CF的几个版本.

更新

我对答案中的猜测数量感到不满意,所以我有机会重现这个问题.我使用了一台带有CF10的5岁Mac进行测试.

原始代码:8100ms

改进的原始代码:750毫秒

ArrayAppend方法:~15ms

如果我在运行测试时将VisualVM挂钩到ColdFusion进程上,我可以看到原始代码在运行期间咀嚼了几百兆内存.没有我最初的数学建议那么糟糕; 我怀疑它只是在循环中每次创建一个大字符串,而不是每个单独连接一次.它会在每次运行期间触发2-3个小的垃圾收集,这会使性能下降.它还在运行的核心上使用100%的CPU.

ArrayAppend代码平均不会触发GC,您很难看到正在使用的内存.

我不明白为什么原始代码花了很长时间,但其他因素将是CPU速度,可用内存,访问数据库(我使用MySQL5),CF版本等.

撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有