2010-03-24 2 views
7

최신 버전의 ColdFusion (저는 CF 8 및 9가 믿을 수 있습니다)을 사용하면 JSON과 유사한 객체 리터럴 표기법으로 구조체를 만들 수 있습니다.ColdFusion 구조체 직접 할당 대 객체 리터럴 표기

제 질문은 본질적으로 정적 인 데이터에 대한 개별 할당보다 개체 리터럴 표기법을 사용하는 데 특별한 이점 (실행 효율성)이 있습니까? 예를 들어

:

이 같은 일을 할 것입니다 개별 과제로 :

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

좋아요! 정확히 내가 무엇을 찾고 있었는지. 감사. –

+0

관심있는 메모 : Railo 3.1.2의 차이는 약간 작지만 여전히 중요합니다. – Sergii

+0

사과와 사과를 비교하지 않습니다. 아마도 두 번째 루프에서 연관 배열 표기법을 사용하고 성능 테스트를 다시 실행하십시오. 예 :'' – yfeldblum

4

리터럴 표기법은 절차 적 프로그래밍이 아닌 선언적 프로그래밍입니다.

리터럴 표기법을 사용하면 컴퓨터에 원하는 단계와 명확한 단계를 알릴 수 있습니다. 문자 표기법이 없으면 천천히, 한 장씩 그리고 선명하지 않고 원하는 것을 만들 수 있습니다.

CF8의 문자 표기법은 기껏해야 어색하고 결함이 있습니다. 거의 사용되지 않아야하며 간단한 경우에만 사용해야합니다. CF9의 리터럴 표기법은 문제가 없습니다. 등을

를 사용 :

CF8를 들어, 헬퍼를 정의 할 수 있습니다

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

이 헬퍼가 항상 작동, 구조체 키는 단순히 대문자되지 않습니다 (구조체 키 케이스를 보존 입력 할 때마다 대소 문자가 구분됩니다.) 그리고 묶여서 재귀 적으로 중첩됩니다.

+0

감사합니다. 차이점을 이해합니다. 어떤 식 으로든 쉽게 수행 할 수있는 정적 데이터의 구문 상 단점 (중첩 대괄호/쉼표)을 상쇄하기 위해 개체 리터럴 표기법에 특별한 이점이있는 경우 가장 관심이 많습니다. –

+0

처음에 언급했듯이 리터럴 표기법은 선언적 프로그래밍입니다. 프로그래머는 그의 의도를 간결하고 명확하게 표현합니다. 프로 시저 프로그래밍에서 프로그래머는 데이터 구조를 단계적으로 빌드하는 방법을 지정하는 것으로 축소되며 그의 의도를 간결하고 명확하게 표현할 수 없습니다. 포스트의 나머지 부분은 리터럴 표기법과 CF8 vs CF9에서의 사용에 대한 설명이었습니다. 익숙하지 않거나 연습하지 않고 사용하지 않더라도 구문은 함정이 아닙니다. 대신 구문을 사용하면 프로그래머가 자유롭게됩니다. – yfeldblum

관련 문제