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() 与临时变量的“成本”(即使两种方法输出相同数量的数据),您可能应该执行以下操作:

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)。如果你确实引入了一个变量,这是合理的,有时值得优化“麻烦”,tmpfoolength例如)。

于 2013-05-05T11:43:06.707 回答
3

如果您只遵循简单的规则“永远不要在循环中做之前可以做的事情”,您就不必在基准测试上浪费时间。

(不得不读这样的问题很痛苦,我想殴打一个不知道吐司在哪一边涂黄油的程序员。)

于 2013-05-05T12:14:18.103 回答