我们正处于从ColdFusion 9升级到2016年ColdFusion的过程中,我们注意到整体性能下降了。我们进行了几次模拟,以提供更多的洞察力。下面是一个脚本,给出了性能下降的一个很好的例子。脚本构建一个查询,然后根据查询创建一个结构。
<!--- Machine info --->
<cfset runtime = createObject("java", "java.lang.System")>
<cfset props = runtime.getProperties()>
<cfset env = runtime.getenv()>
<Cfoutput>
coldfusion: #SERVER.ColdFusion.ProductVersion# #SERVER.ColdFusion.ProductLevel#<br>
java.version: #props["java.version"]#<br>
java.vm.name: #props["java.vm.name"]#<br>
os.name: #props["os.name"]#<br>
PROCESSOR_IDENTIFIER: #env["PROCESSOR_IDENTIFIER"]#<br>
PROCESSOR_ARCHITECTURE: #env["PROCESSOR_ARCHITECTURE"]#<br>
NUMBER_OF_PROCESSORS: #env["NUMBER_OF_PROCESSORS"]#<br><Br>
</Cfoutput>
<!--- Create a query --->
<cfset myQuery = QueryNew("Name, Time, Advanced", "VarChar, Time, Bit")>
<cfset testQuery = QueryNew("ColumnA,ColumnB,ColumnC,ColumnD,ColumnE,ColumnF,ColumnG,ColumnH,ColumnI,ColumnJ,ColumnK,ColumnL,ColumnM,ColumnN","VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar,VarChar")>
<!--- Populate the query --->
<Cfloop from=1 to=300 index="x">
<cfset QueryAddRow(testQuery, 1)>
<cfloop index="intLetter" from="#Asc('A')#" to="#Asc('N')#" step="1">
<cfset temp = QuerySetCell(testQuery, "Column#chr(intLetter)#", "Row #x# column #intLetter#", x)>
</cfloop>
</cfloop>
<Cfset init = GetTickCount()>
<!--- Query to structure --->
<Cfset queryToStruct = structNEw()>
<cfloop query="testQuery">
<Cfset init2 = GetTickCount()>
<cfset queryToStruct[testQuery.currentrow] = structNew()>
<cfset queryToStruct[testQuery.currentrow]['ColumnA'] = structNew()>
<cfloop list="#testQuery.columnList#" index="key">
<cfset queryToStruct[testQuery.currentrow]['ColumnA'][testQuery[key][testQuery.currentrow]] = testQuery[key][testQuery.currentrow]>
</cfloop>
<cfoutput>#x#:#GetTickCount()-init2#<br></cfoutput>
</cfloop>
<cfoutput>-----------<br><b>#GetTickCount()-init#</b><br><br><Br></cfoutput>
<!---Cfdump var=#queryToStruct# --->我们有两台服务器,硬件配置完全相同。一台服务器运行在Windows2008/ ColdFusion server 9 Enterprise (Java 1.6.0_14)上,另一台运行在Windows2016/ ColdFusion 2016标准(JavaVersion1.8.0_112)上。两个ColdFusion服务器都具有相同的最小JVM大小(5024 MB)和最大JVM大小(5048 MB)。
ColdFusion 9服务器的性能提高了4倍以上。有人能解释一下为什么会发生这种情况,以及如何解决这个问题吗?
更新
为了排除任何其他会减慢ColdFusion速度的进程,我在同一台虚拟机上安装了ColdFusion 9、ColdFusion 11和ColdFusion 2016,它们都使用内置的web服务器。默认安装设置。结果是: ColdFusion 9最快,紧随其后的是ColdFusion 11,ColdFusion 2016则慢得多。
更新2对脚本进行了一些更改,因此更清楚的是该脚本正在做什么。
更新3结果可以在这里查看:http://136.144.177.152/test2.asp、http://136.144.177.152/test-toma.asp或http://136.144.177.152/test-ag.asp注意到代码实际上已被处理,所以每次加载页面时,结果都略有不同。
另外,我要指出的是,我并不试图优化这段代码。我试着做一个非常简单的可复制的例子。唯一的目的是指出性能上的差异,找出原因和解决办法。
更新4做了一些额外的测试,并发现了潜在的问题。由于某些原因,以下代码在coldfusion 2016 / Windows 2016上非常缓慢:
<cfset tmp = testQuery['ColumnA'][testQuery.currentrow]>我发现非常奇怪的是,更新查询值并不慢。例如。
<cfset testQuery['ColumnA'][testQuery.currentrow] = key>所有结果都可以在这里找到:http://136.144.177.152/test5.asp或http://136.144.177.152/test6.asp。我还在笔记本电脑上安装了coldfusion 2016,没有发现任何性能问题。我还尝试在windows 2012机器上安装coldfusion 2016。在这里,我发现了同样的性能问题。
基于Tomalak建议的更新5,我删除了索引访问符号。这显然是coldfusion 2016的一个性能问题。实际结果可以在这里找到http://136.144.177.152/bug-adobe.asp。我在adobe为这个问题打开了一个bug,https://tracker.adobe.com/#/view/CF-4201966。
发布于 2018-04-11 17:15:29
首先,您正在将CF 9 Enterprise与CF 2016标准进行比较。对于这个例子来说应该不是什么大问题,但是如果你在标准上测试你的整个应用程序,你会发现问题的。我的前一家公司从9Ent迁移到了2016年,我们看到的只是全面的性能改善。当您看到瓶颈时,应该始终考虑重构。这是你升级的原因之一。
最大的问题是如何将query转换为struct。CF 2016具有更先进的功能。将您的遗留过程与这个利用查询对象中的成员函数的流程进行比较。
public array function arrayOfStructs(required query data) {
var results = [];
arguments.data.each(function(row) {
arrayAppend(results, arguments.row);
});
return results;
}query成员函数each()将每个row的内容引用为struct。不需要在每个列上循环,输入一个新键并分配一个值。轰隆隆!好了。快得像地狱一样。
做升级吧。:)
https://stackoverflow.com/questions/49771200
复制相似问题