这里有一个想法:你为什么不直接测量它?
Dim start: start = Timer
...<code here>...
Response.Write FormatNumber(Timer - start, 8)
测量就是知道。话虽如此:您可能想阅读有关画家什莱米尔的故事。
最终 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
就我而言,输出是:
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'ers)确实在编译/JIT 时自行优化了这些东西。编译器/运行时/JIT 通常会“注意到”这些类型的模式,并会自动引入“临时变量”。
但是然后:为什么要在(经典)ASP 中对如此大的数据块进行数万次迭代呢?真的要输出这么多数据吗?后端不能(更多)完成处理吗?您实际上是在 50Kb 字符串上进行 10.000 次迭代吗?或者这只是理论上的讨论?如果您正在“简单、短字符串”上进行一次或少数次迭代,我根本不会为额外的变量而烦恼。这引入了其他问题;例如,如果str
变量发生变化等,必须保持变量“同步”。仅在需要长度的地方使用可读性(和“可理解性”)也会得到改善Len(foo)
。如果你确实引入了一个变量,这是合理的,有时值得优化“麻烦”,tmp
但foolength
例如)。