ここにアイデアがあります: 測定してみませんか?
Dim start: start = Timer
...<code here>...
Response.Write FormatNumber(Timer - start, 8)
測定することは知ることです。そうは言っても、シュレミエル・ザ・ペインターの話を読みたいと思うかもしれません。
最終的には、Response.write がおそらく最もコストのかかる操作になります。Len() と temp 変数の「コスト」を本当に測定したい場合 (両方のメソッドが同じ量のデータを出力したとしても)、おそらく次のようにする必要があります。
Dim I, J, X
Dim start
Dim str : str = String(50000, "-")
Dim tmp : tmp = Len(str)
Response.Write "Temp var:<br>"
For J = 0 to 10
start = Timer
X = 0
For I=0 To 100000
x = x + tmp
Next
Response.write FormatNumber(Timer - start,8) & "<br>"
Next
Response.Write "Len:<br>"
For J = 0 to 10
start = Timer
X = 0
For I=0 To 100000
x = x + Len(str)
Next
Response.write FormatNumber(Timer - start,8) & "<br>"
Next
私の場合、出力は次のとおりです。
Temp var:
0,03125000
0,03125000
0,04687500
0,03125000
0,03515625
0,02734375
0,03125000
0,03125000
0,03515625
0,02734375
0,03125000
Len:
0,04687500
0,04687500
0,03125000
0,04687500
0,04687500
0,04687500
0,05078125
0,02734375
0,04687500
0,05078125
0,04687500
ご覧のとおり、Len() を使用すると、反復ごとにかなり遅くなります (それほど大きくはありませんが、約 35%)。一時変数を使用するのは良い考えですが、この知識や測定がまったくなくても推測できたはずですよね?
VBScript についてはよくわかりませんが、多くの言語 (およびそのコンパイラ/JIT 担当者) は、コンパイル/JIT 時に独自にこのようなものを最適化します。コンパイラ/ランタイム/JIT は通常、これらの種類のパターンを「認識」し、「一時変数」を自動的に導入します。
しかし、それでは、なぜ (従来の) ASP でこのような大量のデータに対して何万回もの反復を行うのでしょうか? 本当にこれだけのデータを出力する必要がありますか? バックエンドか何かで処理を(もっと)行うことはできませんか?50Kb の文字列で実際に 10.000 回の反復を行っていますか? それともこれは単なる理論上の議論ですか?「単純で短い文字列」で 1 回または数回の反復を行う場合、余分な変数を気にする必要はまったくありません。これにより、他の問題が発生します。たとえば、変数が変更された場合などに、変数を「同期」しておく必要があります。また、長さが必要な場所をstr
使用するだけで、読みやすさ(および「理解可能性」)が向上します。変数を導入すると、正当化され、最適化の価値がある場合がありますLen(foo)
「面倒」、tmp
ただしfoolength
、たとえば)。