VBScript(经典ASP)性能 - 将字符串长度存储在循环中的临时变量中

Roy*_*hoa 1 vbscript performance string-length asp-classic

我想知道如果我在使用循环列表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
Run Code Online (Sandbox Code Playgroud)

使用临时变量的代码示例:

'--
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
Run Code Online (Sandbox Code Playgroud)

你觉得哪个更好?

谢谢!

Rob*_*III 6

这是一个想法:你为什么不测量它?

Dim start: start = Timer
...<code here>...
Response.Write FormatNumber(Timer - start, 8)
Run Code Online (Sandbox Code Playgroud)

衡量就是知道.话虽如此:您可能想要阅读有关画家Shlemiel的故事.

最终,Response.write可能是最昂贵的操作; 如果你真的想测量Len()与临时变量的"成本"(即使两种方法都输出相同数量的数据),你应该做这样的事情:

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
Run Code Online (Sandbox Code Playgroud)

在我的例子中,输出是:

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
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,使用Len()每次迭代都会慢得多(即使它不是那么多,大约35%).使用临时变量将是一个好主意,但你可能已经猜到,没有这些知识或测量,不是吗?

我不确定VBScript,但许多语言(及其编译器/ JIT'ers)在编译/ JIT时自己优化这些东西.编译器/运行时/ JIT通常会"注意到"这些模式并自动引入"临时变量".

但那么:你为什么要在(经典)ASP中对如此大量的数据进行数万次迭代呢?你真的要输出这么多数据吗?无法通过后端或其他事情(更多)完成处理?你在50Kb字符串上实际上做了10.000次迭代吗?或者这只是一个理论上的讨论?如果您正在对"简单的短字符串"进行一次或少量迭代,我根本不会考虑额外的变量.这引入了其他问题; 例如,如果str变量改变等,必须保持变量"同步" .只要Len(foo)你需要长度,你的可读性(以及"可理解性")就会得到改善.如果你确实引入了一个变量,这是合理的,有时是一个优化值的"麻烦",我至少会确保其名称正确(不是tmp,但foolength为例).