哪种方法表现更好? (或者没有足够的差别吗?)

时间:2010-02-03 21:31:44

标签: performance asp-classic vbscript

以下哪项(如果有的话)会带来最小的性能?或者是差异那么小,我应该使用最可读的?

在同一页面中,我注意到以前的维护者使用的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不是一个选项,因此这些评论无需费力发布。

4 个答案:

答案 0 :(得分:4)

您可以自己对此进行基准测试,以获得最佳效果,因为某些性能会因输入字符串的大小而异。

但是,我会从维护的角度说,第二个更容易阅读/理解。

答案 1 :(得分:2)

好的方法3显然会比其他两个更差。

在方法1和方法2之间,差异将是微不足道的。值得记住的是,VBScript不进行布尔表达式短切,因此在方法1中strRqMethod将与所有字符串进行比较,即使它与第一个字符串匹配。方法2中的Case语句至少可以选择不这样做,并且可能会在集合中找到第一个匹配时停止比较。

我很乐意选择方法2 ,因为我认为可能更快,但因为它以最清晰的方式表达了代码的意图。

答案 2 :(得分:1)

受过教育的猜测:
在性能方面,前两种方法大致相同;第三种方法很可能更慢,即使它被内联。

此外,前两者之间的差异可能在微秒范围内,因此您可以安全地将此视为 premature optimization ...

由于我们讨论的是OR-ed布尔评估的主题,所以需要了解一些事项:

  • 大多数编译器/解释器将使用“ short circuit optimization ”来评估布尔表达式,这意味着在找到的第一个真实条件下,不会评估后续的OR-ed条件(因为它们不会不改变结果。因此,以[粗略]递减概率顺序列出条件是一个好主意,即首先列出所有常见情况。 (另请注意,短路评估也与AND-ed表达式一起使用,但当然相反,即在第一个错误条件下,evalation停止,因此建议写出最可能条件失败的表达式首先。)
  • 比较字符串是一项常见的任务,大多数语言都以非常优化的方式完成,语言水平很低。我们可以考虑改进这项特定任务的大多数技巧通常都比本机运营商效率低。

答案 3 :(得分:0)

只要在循环中没有完成100.000(换句话说:一个lof)次,它就没有区别。虽然它是解析的代码,但我们仍然可以假设解析快速而快速地完成,不会产生影响。

我发现只有在连接大量字符串时才会遇到严重的性能问题 - 就像我在运行页面时发现的那样,将调试代码添加到全局字符串中以便只能在页面底部调度调试。页面越长,运行的代码越多,我添加的调试代码就越多,显示页面所花费的时间就越长。由于这个页面正在进行一些数据库访问,我认为它在代码中的某个地方发生了延迟,只是发现它只是调试语句(说实话,我有连接调试字符串的日志)。