我们正在从 ColdFusion 9 升级到 ColdFusion 2016,我们注意到性能总体下降。我们进行了多次模拟以提供更多洞察力。下面是一个脚本,它给出了性能下降的一个很好的例子。该脚本构建一个查询,然后根据该查询创建一个结构。
<!--- 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# --->
我们有两台具有完全相同硬件配置的服务器。一台服务器在 Windows 2008 / ColdFusion Server 9 Enterprise(Java 版本 1.6.0_14)上运行,另一台在 Windows 2016 / ColdFusion 2016 Standard(Java 版本 1.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。在这里,我发现了相同的性能问题。
更新 5 根据 Tomalak 的建议,我删除了索引访问表示法。这显然是 Coldfusion 2016 的性能问题。实际结果可以在这里找到http://136.144.177.152/bug-adobe.asp。我在 adobe 上针对此问题打开了一个错误https://tracker.adobe.com/#/view/CF-4201966。