以下哪项(如果有的话)会带来最小的性能?或者是差异那么小,我应该使用最可读的?
在同一页面中,我注意到以前的维护者使用的3种样式:
方法1 :
If (strRqMethod = "Forum" or strRqMethod = "URL" or strRqMethod = "EditURL" or strRqMethod = "EditForum") Then
...
End If
方法2 :
Select Case strRqMethod
Case "Reply", "ReplyQuote", "TopicQuote"
'This is the only case in this statement...'
...
End Select
方法3 :
If InArray("Edit,EditTopic,Reply,ReplyQuote,Topic,TopicQuote",strRqMethod) Then
...
End If
.
.
.
'Elsewhere in the code'
function InArray(strArray,strValue)
if strArray <> "" and strArray <> "0" then
if (instr("," & strArray & "," ,"," & strValue & ",") > 0) then
InArray = True
else
InArray = False
end if
else
InArray = False
end if
end function
远离Classic ASP / VBScript不是一个选项,因此这些评论无需费力发布。
答案 0 :(得分:4)
您可以自己对此进行基准测试,以获得最佳效果,因为某些性能会因输入字符串的大小而异。
但是,我会从维护的角度说,第二个更容易阅读/理解。
答案 1 :(得分:2)
好的方法3显然会比其他两个更差。
在方法1和方法2之间,差异将是微不足道的。值得记住的是,VBScript不进行布尔表达式短切,因此在方法1中strRqMethod
将与所有字符串进行比较,即使它与第一个字符串匹配。方法2中的Case语句至少可以选择不这样做,并且可能会在集合中找到第一个匹配时停止比较。
我很乐意选择方法2 不,因为我认为可能更快,但因为它以最清晰的方式表达了代码的意图。
答案 2 :(得分:1)
受过教育的猜测:
在性能方面,前两种方法大致相同;第三种方法很可能更慢,即使它被内联。
此外,前两者之间的差异可能在微秒范围内,因此您可以安全地将此视为 premature optimization ...
由于我们讨论的是OR-ed布尔评估的主题,所以需要了解一些事项:
答案 3 :(得分:0)
只要在循环中没有完成100.000(换句话说:一个lof)次,它就没有区别。虽然它是解析的代码,但我们仍然可以假设解析快速而快速地完成,不会产生影响。
我发现只有在连接大量字符串时才会遇到严重的性能问题 - 就像我在运行页面时发现的那样,将调试代码添加到全局字符串中以便只能在页面底部调度调试。页面越长,运行的代码越多,我添加的调试代码就越多,显示页面所花费的时间就越长。由于这个页面正在进行一些数据库访问,我认为它在代码中的某个地方发生了延迟,只是发现它只是调试语句(说实话,我有连接调试字符串的日志)。