1

すべてのループで計算する代わりに、リスト 10,000 ループのループを使用しているときに、文字列の長さを一時変数に格納している場合にパフォーマンスが向上するかどうかを知りたいですか?

文字列の長さを計算するコード例:

'--
Dim I
Dim str : str = "Lets say this string length is around 50,000"
'--
For I=0 To 100000
    Response.Write Len(str) & "<br>"
Next

一時変数を使用したコード例:

'--
Dim I
Dim str : str = "Lets say this string length is around 50,000"
Dim temp : temp = Len(str)
'--
For I=0 To 100000
    Response.Write temp & "<br>"
Next

何が良いと思いますか?

ありがとう!

4

2 に答える 2

6

ここにアイデアがあります: 測定してみませんか?

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、たとえば)。

于 2013-05-05T11:43:06.707 に答える
3

「ループの前にできることをループで実行しない」という単純なルールに従えば、ベンチマークで時間を無駄にする必要はありません。

(そのような質問を読まなければならないのは苦いです。トーストがどちら側にバターを塗られているかわからないプログラマーを殴りたいです。)

于 2013-05-05T12:14:18.103 に答える