ColdFusion结构化直接赋值与对象文字符号

Tom*_*ard 7 coldfusion

较新版本的ColdFusion(我相信CF 8和9)允许您使用类似于JSON的对象文字表示法创建结构.

我的问题是,对于基本上是静态的数据,使用对象文字符号而不是单独分配是否有特定的好处(执行效率可能)?

例如:

通过个人作业,您可以执行以下操作:

var user = {};
user.Fname = "MyFirstnam";
user.Lname = "MyLastName";
user.titles = [];
ArrayAppend(user.titles,'Mr');
ArrayAppend(user.titles,'Dr.');
Run Code Online (Sandbox Code Playgroud)

对于对象文字,你会做类似的事情.

var user = {Fname = "MyFirstnam",
            Lname = "MyLastName",
            titles = ['Mr','Dr']};
Run Code Online (Sandbox Code Playgroud)

现在这个有限的例子很简单,但如果title是一个结构数组(Say一个地址数组),那么文字符号就变得很难处理了.

Mar*_*ona 4

在我尝试任何事情之前,我立即认为文字会更快,因为您在运行时创建所需的所有内容,并且不需要浪费时间创建变量,然后调用函数进行附加等等。

然后我编写了一个小测试,生成一个包含结果的图表。你让我很好奇:-)

结果证明我是对的,正如您所看到的,图表显示了惊人的差异: 替代文本

但请记住,虽然人们会跳跃并使用字面符号,但我认为重要的是要记住字面符号可能会很尴尬,并且大多数时候会更加混乱。

显然,如果您正在开发一个确实需要速度提升的页面,那么文字符号就是您所寻找的,但请注意,有时在 CF8 上,它会产生一些奇怪的行为。

只是为了向您展示我运行的测试类型:

<cfset aLiterals = arrayNew(1) />
<cfset aDirect = arrayNew(1) />

<cfsilent>
    <cfloop from="1" to="10000" index="mm">

        <!--- LITERAL --->
        <!--- start timer --->
        <cfset start = getTickcount() />
        <cfloop from="1" to="1000" index="ii">  
            <cfset user = {Fname = "MyFirstnam", Lname = "MyLastName", titles = ['Mr','Dr']} />
        </cfloop>
        <!--- end timer --->
        <cfset end = getTickCount()>

        <!--- Display total time --->
        <cfset total = end-start>
        <cfset arrayAppend(aLiterals,total) />

        <!--- DIRECT --->
        <!--- start timer --->
        <cfset start1 = getTickcount() />
        <cfloop from="1" to="1000" index="jj">
            <cfset user = {} />
            <cfset user.Fname = "MyFirstnam" />
            <cfset user.Lname = "MyLastName" />
            <cfset user.titles = [] />
            <cfset ArrayAppend(user.titles,'Mr') />
            <cfset ArrayAppend(user.titles,'Dr.') />
        </cfloop>

        <!--- end timer --->
        <cfset end1 = getTickCount()>

        <!--- Display total time --->
        <cfset total1 = end1-start1>
        <cfset arrayAppend(aDirect,total1) />   
    </cfloop>
</cfsilent>

<!--- The cfchart --->
<cfchart format="png" xaxistitle="function" yaxistitle="Loading Time (in secs.)">
    <cfchartseries type="bar" serieslabel="literal">
        <cfchartdata item="literal" value="#arrayAvg(aLiterals)#">
    </cfchartseries>
    <cfchartseries type="bar" serieslabel="direct">
        <cfchartdata item="direct" value="#arrayAvg(aDirect)#">
    </cfchartseries>
</cfchart>
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助。