2010-03-24 42 views
7

較新版本的ColdFusion(我相信CF 8和9)允許您使用類似於JSON的對象文字符號來創建結構。ColdFusion結構直接分配vs對象文字表示法

我的問題是,是否有具體的好處(執行效率可能)使用對象文字符號對個人分配基本上靜態的數據?

例如:

隨着個人作業,你會做這樣的事情:

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

而使用對象的文字,你會做這樣的事情。

var user = {Fname = "MyFirstnam", 
      Lname = "MyLastName", 
      titles = ['Mr','Dr']}; 

現在這個有限的例子是不可否認簡單,但如果是標題結構的陣列(說地址陣列),則文字符號變得笨拙的工作。

回答

4

在我嘗試任何東西之前,我立刻想到文字會更快,因爲您在運行時創建了所需的所有內容,並且不需要浪費時間創建變量,然後調用函數來追加所有內容。

然後我寫了一個小測試,用結果生成一個圖表。你讓我好奇,有:-)

結果證明我是對的,因爲圖表顯示了驚人的差異,你可以看到: alt text http://i44.tinypic.com/jiz8lw.jpg

但要記住的是,雖然人會跳,並用文字符號去,我認爲重要的是要記住,字面記法可能會很尷尬,並且大部分時間會讓更多人困惑。

很明顯,如果你正在開發一個真正需要提速的頁面,文字符號就是你要查找的內容,但是請注意,有時在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> 

希望這有助於你。

+0

太棒了!正是我在找什麼。謝謝。 – 2010-03-24 11:55:40

+0

感興趣的注意事項:對於Railo 3.1.2的區別是有點小,但仍然顯着。 – Sergii 2010-03-24 12:38:46

+0

你沒有比較蘋果和蘋果。也許在第二個循環中,嘗試使用關聯數組表示法,然後再次運行性能測試。例如:'' – yfeldblum 2010-03-24 13:00:52

4

字面符號是聲明性編程,而不是程序性編程。

使用文字符號,您可以告訴計算機,您需要清楚並且只需一步。沒有文字記號,你可以慢慢地,逐段地建立你想要的東西,而且不會清晰。

請注意,CF8中的文字符號充其量是尷尬和有缺陷的。它應該很少使用,然後只在簡單情況下使用。 CF9中的文字符號很好。

對於CF8,您可以定義助手:

,並以此作爲這樣的:

var user = $S(
    Fname = "MyFirstnam", 
    Lname = "MyLastName", 
    titles = $A('Mr', 'Dr') 
); 

這些傭工工作的所有時間,保持結構重點案件(結構鍵不是簡單地大寫但是在鍵入它們的時候是有限制的),並且無限制地遞歸嵌套。

+0

謝謝。我瞭解其中的差異,如果對象文字符號有特別的優勢,可以很容易地以任何方式抵消靜態數據的語法陷阱(嵌套括號/逗號),我最感興趣的是。 – 2010-03-24 11:35:40

+0

正如我在開頭提到的那樣,文字符號是聲明性編程,程序員簡潔明瞭地表達他的意圖。在程序編程中,程序員被簡化爲指定如何逐步地,逐步地構建數據結構,並且無法簡潔明瞭地表達他的意圖。這篇文章的其餘部分是對字面符號及其在CF8與CF9中的使用進行澄清。雖然人們可能不熟悉它,或者沒有經過實踐就不會使用它,但語法並不是一個陷阱 - 語法可以讓程序員免去。 – yfeldblum 2010-03-24 12:58:46