测试存在isdefined("arguments.argument")
或设置arguments.argument
的默认值是否更快?
答案 0 :(得分:8)
我使用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#">
答案 1 :(得分:6)
正如@ matt-busche指出的那样,担心这类事情的表现是一种过早优化的情况:性能差异是无关紧要的。键入问题可能需要花费更多时间,而不是在您编写的应用程序的整个生命周期中,一个或另一个会为您节省的累积时间。
你应该瞄准的是编写清晰的代码,最准确地反映逻辑的意图和代码的预期用法。
如果默认值是该参数最有用的值,则应为参数设置默认值。这并不总是合适的:有时没有“最有用的值”,因此参数不应该有默认值,因此需要调用代码传递一个值。
永远不应该编写设置默认值的代码,以便后续代码不会中断(例如:将字符串参数默认为“”,这样可以安全地假设它存在于后续代码中)。
指定参数默认值的一个好处是默认值反映在组件的元数据及其自动生成的文档中。如果您正在为第三方消费编写API,这很方便。
另一方面,人们通常应该避免使用isDefined()
,因为它是一个相当有限,不准确的功能,而且我也看到它在某些罕见的情况下也会出现误报(并且我不仅仅是不了解范围 - 查找规则)。
几乎总是应该structKeyExists()
使用isDefined()
。
答案 2 :(得分:5)
在正常编码中,使用一个或另一个之间没有明显的性能优势。
话虽如此,您应该使用structKeyExists()
代替isDefined()
,原因很简单。
structKeyExists()
函数会强制您调整变量的范围。 IsDefined()
函数允许使用超级代码,这会导致应用程序质量下降。
ColdFusion: More efficient structKeyExists() instead of isDefined()