测试存在isdefined("arguments.argument")或设置默认值是否更快arguments.argument?
我使用了一个测试isDefined(),structKeyExists()并设置了一个默认值.我想出来了
isDefined - 184ms for 100k iterations
structKeyExists - 149 ms for 100k iterations
Default - 139ms for 100k iterations
Run Code Online (Sandbox Code Playgroud)
因此,看起来设置默认值是最快的选项,但默认值之间的差异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#">
Run Code Online (Sandbox Code Playgroud)
正如@ matt-busche指出的那样,担心这类事情的表现是一种过早优化的情况:性能差异是无关紧要的.键入问题可能需要花费更多时间,而不是在您编写的应用程序的整个生命周期中,一个或另一个会为您节省的累积时间.
你应该瞄准的是编写清晰的代码,最准确地反映逻辑的意图和代码的预期用法.
如果默认值的值是该参数最可能有用的值,则应为参数设置默认值.这并不总是合适的:有时候没有"最有用的值",因此参数不应该有默认值,因此需要调用代码传递一个值.
永远不应该编写设置默认值的代码,以便后续代码不会中断(例如:将字符串参数默认为"",这样可以安全地假设它存在于后续代码中).
指定参数默认值的一个好处是默认值反映在组件的元数据及其自动生成的文档中.如果您正在为第三方消费编写API,这很方便.
另一方面,人们通常应该避免,isDefined()因为它是一个非常有限的,不准确的功能,而且我也看到它在一些罕见的情况下也会产生误报(并且我不理解范围查找规则).
几乎总是一个人应该使用structKeyExists()过isDefined().
在正常编码中,使用一个或另一个之间没有可察觉的性能优势.
话虽这么说,你应该使用structKeyExists()而不是isDefined()一个简单的原因.
该structKeyExists()函数强制您对变量进行范围调整.该IsDefined()功能允许超级邋code的代码,这导致较差的应用程序.
ColdFusion:更有效的structKeyExists()而不是isDefined()
| 归档时间: |
|
| 查看次数: |
210 次 |
| 最近记录: |