Coldfusion:为参数设置默认值还是使用isdefined更快?
测试是否存在Coldfusion:为参数设置默认值还是使用isdefined更快?,coldfusion,Coldfusion,测试是否存在已定义(“arguments.argument”)或为arguments.argument设置默认值是否更快?在正常编码中,使用两者之间没有明显的性能优势 也就是说,您应该使用structKeyExists()而不是isDefined(),原因很简单 structKeyExists()函数强制您确定变量的范围。IsDefined()函数允许超松散的代码,这会导致劣质的应用程序 我使用isDefined(),structKeyExists()运行了一个测试,并设置了默认值。我想出了 i
已定义(“arguments.argument”)
或为arguments.argument设置默认值是否更快?在正常编码中,使用两者之间没有明显的性能优势
也就是说,您应该使用structKeyExists()
而不是isDefined()
,原因很简单
structKeyExists()
函数强制您确定变量的范围。IsDefined()
函数允许超松散的代码,这会导致劣质的应用程序
我使用isDefined()
,structKeyExists()
运行了一个测试,并设置了默认值。我想出了
isDefined - 184ms for 100k iterations
structKeyExists - 149 ms for 100k iterations
Default - 139ms for 100k iterations
因此,看起来设置默认值是最快的选择,但是默认值和structKeyExists
之间的差异非常小,这无关紧要。我不会在代码中的任何地方使用isDefined()
下面是我运行的代码
<cfset loops = 100000>
<cffunction name="myfunc" returntype="void">
<cfargument name="myTest">
<cfif isDefined('arguments.myTest')>
</cfif>
</cffunction>
<cffunction name="myfunc2" returntype="void">
<cfargument name="myTest">
<cfif structKeyExists(arguments,'myTest')>
</cfif>
</cffunction>
<cffunction name="myfunc3" returntype="void">
<cfargument name="myTest" default="">
</cffunction>
<cfset start = getTickCount()>
<cfoutput>
<cfloop from="1" to="#loops#" index="i">
#myfunc()#
</cfloop>
</cfoutput>
<cfdump var="#getTickCount() - start#"><br>
<cfset start = getTickCount()>
<cfoutput>
<cfloop from="1" to="#loops#" index="i">
#myfunc2()#
</cfloop>
</cfoutput>
<cfdump var="#getTickCount() - start#"><br>
<cfset start = getTickCount()>
<cfoutput>
<cfloop from="1" to="#loops#" index="i">
#myfunc3()#
</cfloop>
</cfoutput>
<cfdump var="#getTickCount() - start#">
#myfunc()#
#myfunc2()#
#myfunc3()#
正如@matt busche所指出的,担心这类事情的性能是过早优化的例子:性能差异无关紧要。输入问题所花费的时间可能比在您编写的应用程序的整个生命周期中一个或另一个问题所节省的累计时间要多
您的目标应该是编写清晰的代码,最准确地反映逻辑的意图和代码的预期用途
如果默认值是该参数最可能有用的值,则应为该参数设置默认值。这并不总是合适的:有时没有“最可能有用的值”,因此参数不应该有默认值,因此需要调用代码传递值
千万不要编写设置默认值的代码,这样后续代码就不会中断(例如:将字符串参数默认为“”,这样就可以安全地假定它存在于后续代码中)
指定参数默认值的一个好处是,默认值反映在组件的元数据及其自动生成的文档中。如果您正在编写供第三方使用的API,那么这非常方便
另一方面,人们通常应该避免使用isDefined()
,因为它是一个非常有限、不准确的函数,而且我看到它在一些罕见的情况下也会出现误报(不仅仅是我不了解范围查找规则)
几乎总是应该使用structKeyExists()
overisDefined()
GetTickCount()将帮助您计算这两种方法的时间。太好了!我会在有机会的时候公布结果。Thxe每个人都说avoid是定义的,这是一个遗留函数,但认真地说,谁会注意到额外的毫秒或2。时间最好花在调优糟糕的查询上,这通常可以节省几秒钟而不是几毫秒。isdefined强制您确定变量的范围,这就是使用的原因it@MattBusche-我想你的意思是structKeyExists
强迫你去观察,对吗?@Leigh-ha,是的。今天早上太早了。@snakestructKeyExists
迫使您确定变量的范围,这就是使用itAdam的原因,您的情况很好。我完全同意。