我们正在升级从ColdFusion 9到ColdFusion 2016,并且我们已经注意到整体性能下降。我们运行了几个模拟来提供更多的见解。以下是一个脚本,它给出了性能下降的一个很好的例子。该脚本构建查询,然后从查询创建结构。
我们有两台完全相同硬件配置的服务器。一台运行在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服务器的性能比ColdFusion 2016快4倍以上。可以有人给出为什么会发生这种情况以及如何解决?
更新为了排除其他可能导致ColdFusion变慢的进程,我在同一台虚拟机上安装了ColdFusion 9、ColdFusion 11和ColdFusion 2016,同时使用内置Web服务器。默认安装设置。结果是:ColdFusion 9是最快的,其次是ColdFusion 11。ColdFusion 2016要慢得多。
更新2 改进了脚本,使其更清晰地表明该脚本正在做什么。
所有结果可以在这里找到:http://136.144.177.152/test5.asp或http://136.144.177.152/test6.asp。我还在我的笔记本电脑上安装了coldfusion 2016,并没有发现性能问题。我还尝试在Windows 2012机器上安装coldfusion 2016。在这里,我发现了相同的性能问题。
第五次更新: 根据Tomalak的建议,我删除了索引访问符号。这显然是coldfusion 2016的性能问题。实际结果可以在这里找到http://136.144.177.152/bug-adobe.asp。我在adobe开了一个问题报告https://tracker.adobe.com/#/view/CF-4201966。
<!--- 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服务器的性能比ColdFusion 2016快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的建议,我删除了索引访问符号。这显然是coldfusion 2016的性能问题。实际结果可以在这里找到http://136.144.177.152/bug-adobe.asp。我在adobe开了一个问题报告https://tracker.adobe.com/#/view/CF-4201966。
Evaluate()
调用。 - Tomalak