0

(これは、構造体に関する以前の質問へのフォローアップのようなものです)

これは:

<cfset myArray = ArrayNew(1)>
<cfloop query="myQuery">
    <cfset myArray[1] = queryCol1>
    <cfset myArray[2] = queryCol2>
    <cfset myArray[3] = queryCol3>
    <cfset funcionWithArrayParam(myArray)>
</cfloop>

... これよりも効率的にシステム リソースを使用します。

<cfloop query="myQuery">
    <cfset functionWithArrayParam([queryCol1, queryCol2, queryCol3])>
</cfloop>

?

また、焦点を絞るために、最初の例の配列は、関数へのフィード以外の目的を果たさないと仮定します。また、クエリや列のデータが十分に大きく、効率を考慮する価値があると仮定します。

2 番目の方法はそのコンパクトさが魅力的ですが、私の懸念は、反復ごとに作成される新しい配列の数がわからないことです。CF では配列が値で渡されるため、最初の方法で配列が作成されると思います。しかし、それは 2 番目のメソッドが 2 つの配列 (暗黙的に作成されたものと、関数で使用するためのそのコピー) を作成することを意味するのでしょうか?

また、簡略記法と、配列を作成するための複数の cfset ステートメントとのパフォーマンスの比較について知ることも興味深いでしょう。前者も配列を作成するため、りんごとりんごではないことに気付きますが、それでも...これは自分で簡単にテストできると思います。

4

3 に答える 3

2

パフォーマンスに関しては、違いはごくわずかですが、暗黙的な作成は通常わずかに遅くなりますが、暗黙的な作成ははるかに読みやすく、何らかの大規模なスケーリングの問題を扱っていない限り、長期的にはより重要です。

編集: 簡単なテスト スクリプトを作成しましたが、まったく異なる結果が得られました。どちらも非常に近いと思いますが、問題にはなりませんが、システムでテストを実行してください。CF10を搭載したMacbook Proでこれを実行していますが、特定の実装によって異なる場合があります。結果として得られる Java バイト出力によって、2 つのメソッド間の構造上の違いが明らかになる可能性があります。

<cfset iterations = 1000000>

<cfset start = getTickCount()>

<cfloop from="1" to="#iterations#" index="x">
    <cfset a[x] = arrayNew(1)>
    <cfset a[x][1] = x>
    <cfset a[x][2] = x>
    <cfset a[x][3] = x>
</cfloop>
<cfoutput>Explicit Array took: #getTickCount()-start#ms</cfoutput><br>

<cfset start = getTickCount()>
<cfloop from="1" to="#iterations#" index="y">
    <cfset b[y] = [y, y, y]>
</cfloop>

<cfoutput>Implicit Array took: #getTickCount()-start#ms</cfoutput><br>
于 2013-09-10T17:54:12.593 に答える
0

アダム・キャメロンは彼のコメントの 1 つで技術的に私の質問に答えましたが、それは彼の「公式」の答えではなかったので、私は自分自身を (少しの視点と共に) 提供します。

答えはイエスです。実際、2 番目の例で示した方法で暗黙的な配列作成を使用するのは効率的ではありません。それは、ほとんどの場合、それを回避することができないということですか? もちろん違います!ただし、同じ操作を実行する 2 つの方法を紹介しました。2 番目の方法は、メモリ使用量に関しては 1 番目の方法の半分の効率です (さらに少し遅くなります)。私の世界では、これは知っておく価値があります。そのような状況で暗黙の配列作成を使用することを引き続き主張する場合は、その理由を自問することは害にならないかもしれません。コードを 1 行に圧縮することが、女子プログラマーに好印象を与えると考えているからですか? 私はそれが何かだと思います。ただし、「読みやすさ」が最も人気のある言い訳のようです (結局のところ、それが唯一の理由です)。暗黙的な配列/構造体の作成が明示的なものよりも客観的に劣っていない尺度) 私のように、可読性があいまいで移動するターゲットであることがわかった場合、効率がコーディング方法に影響を与えることに何の問題もありません。効率的なアルゴリズムを作成する方法を知っている場合は、一般的な「時期尚早の最適化」という誇張に怯えて、代わりに非効率的なアルゴリズムを作成する必要はありません。これは、時期尚早の最適化と同様に、視点が欠けていることを示しています。

于 2013-09-13T23:21:42.933 に答える