isdefined("arguments.argument")
测试是否存在或设置默认值是否更快arguments.argument
?
3 回答
我使用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#">
正如@matt-busche 所指出的,担心这类事情的性能是一种过早优化的情况:性能差异是无关紧要的。输入问题所花费的时间可能比一个或另一个在您正在编写的应用程序的整个生命周期中为您节省的累积时间要长。
您的目标应该是编写清晰的代码,最准确地反映逻辑的意图和代码的预期用途。
如果默认值是该参数最可能有用的值,您应该为您的参数设置一个默认值。这并不总是合适的:有时没有“最可能有用的值”,所以参数不应该有默认值,因此需要调用代码传递一个值。
永远不应该编写设置默认值的代码,以便后续代码不会中断(例如:将字符串参数默认为“”,以便可以安全地假设它存在于后续代码中)。
指定参数默认值的一个好处是默认值反映在组件的元数据及其自动生成的文档中。如果您正在编写供第三方使用的 API,这将非常方便。
另一方面,通常应该避免isDefined()
,因为它是一个非常有限、不准确的功能,而且我已经看到它在一些罕见的情况下也会给出误报(不仅仅是我不理解范围查找规则)。
几乎总是应该使用structKeyExists()
over isDefined()
。
在正常编码中,使用一种或另一种之间没有明显的性能优势。
话虽如此,您应该使用structKeyExists()
而不是isDefined()
出于一个简单的原因。
该structKeyExists()
函数强制您限定变量的范围。该IsDefined()
函数允许超级草率的代码,从而导致低劣的应用程序。