Структуры ColdFusion Прямое Присвоение по сравнению с нотацией литерала объектов

Более новые версии ColdFusion (я верю CF 8 и 9) позволяют Вам создавать структуры с нотацией литерала объектов, подобной JSON.

Мой вопрос, там определенные преимущества (эффективность выполнения, возможно) к использованию нотации литерала объектов по отдельным присвоениям для данных, которые чрезвычайно статичны?

Например:

С отдельными присвоениями Вы сделали бы что-то вроде этого:

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']};

Теперь этот ограниченный пример по общему признанию прост, но если заголовки были массивом структур (Скажите, что массив адресов), литеральная нотация становится неудобной работать с.

7
задан Tom Hubbard 24 March 2010 в 11:07
поделиться

2 ответа

Прежде чем я что-то пробовал, я сразу подумал, что литералы будут быстрее, поскольку вы создаете все, что вам нужно, во время выполнения, и не нужно тратить время создание переменных, затем вызов функций для добавления и все такое.

Затем я написал небольшой тест, который выдает диаграмму с результатами. Вы меня заинтересовали: -)

Результаты доказывают, что я был прав, поскольку график показывает ошеломляющую разницу, как вы можете видеть: alt text

Но помните, что хотя можно было бы прыгнуть и уйти с буквальным обозначением , Я думаю, важно помнить, что буквальное обозначение может быть неудобным и в большинстве случаев еще больше сбивает с толку.

Очевидно, что если вы разрабатываете страницу, которая действительно нуждается в повышении скорости, буквальная нотация - это то, что вы ищете, но имейте в виду, что иногда на 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>

Надеюсь, это вам поможет.

4
ответ дан 7 December 2019 в 05:21
поделиться

Буквальная нотация - это декларативное, а не процедурное программирование.

Используя буквенную нотацию, вы четко и одномоментно сообщаете компьютеру, чего вы хотите. Без буквенной нотации вы создаете то, что хотите, медленно, по частям и без ясности.

Обратите внимание, что буквенная нотация в CF8 в лучшем случае неудобна и несовершенна. Ее следует использовать редко, и то только в простых случаях. Буквальная нотация в CF9 в порядке.

Для CF8 вы можете определить помощников:

function $A() {
    var r = [ ];
    var i = 0;
    var m = ArrayLen(Arguments);
    for(i = 1; i <= m; i += 1)
        ArrayAppend(r, Arguments[i]);
    return r;
}
function $S() {
    return StructCopy(Arguments);
}

И использовать их как таковые:

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

Эти помощники работают все время, сохраняют регистр ключей struct (ключи struct не просто прописные, а в том регистре, в котором вы их набрали), и рекурсивно гнездятся без ограничений.

4
ответ дан 7 December 2019 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: