在vbscript中调用大量函数的性能影响

时间:2014-02-20 08:29:05

标签: vbscript

我有很多这样的子程序和函数:

Sub LogInfo(Txt)
    'Write an entry to the log file

    If LogEnableInfo Then Log "Info: " & Txt
End Sub

或者这个:

Function GetSettingValue(Key)
    'Get the value of a setting or an empty string if the setting is not set

    Dim Res

    If Settings.Exists(UCase(Key)) Then Res = Settings(UCase(Key)) Else Res = ""

    GetSettingValue = Res
End Function

或者这个:

Sub DoExp(Exp, ErrTag)
    'Execute an HS.Exp with Error handling and Debugging

    Err.Clear
    On Error Resume Next

    HS.Exp Exp

    If Err.Number <> 0 Then
        LogError "HS.Exp """ & Exp & """ , Tag: " & ErrTag
        Err.Clear
    ElseIf LogEnablePut Then
        Log "Put: HS.Exp """ & Exp & """ , Tag: " & ErrTag
    End If

    On Error GoTo 0
End Sub

他们真的是一个做得不多的衬里,但是我经常使用很多次,所以我不想每次都输出它。我也经常使用递归函数。

由于速度和内存使用对我的应用程序至关重要,我想知道的是vbscript中调用函数或子函数的行为是否会对性能产生相当大的影响?我知道在PHP中,这被称为性能问题。我可以继续创建数以万计的小嵌套函数来完成所有工作,还是应该稍微使用它们?

3 个答案:

答案 0 :(得分:2)

根据我在重复使用函数的经验在VBS中是一件坏事,在我写的一个小测试脚本中,我发现使用函数的速度要慢5倍。

startTime = Timer
x = 0
For i = 0 To 1000000000
    x = x + 1

Next

endTime = Timer

WScript.Echo x
WScript.Echo CStr(endTime - startTime)

startTime = Timer

y = 0

For i = 0 To 1000000000
    y = fooBooGoo(y)

Next

endTime = Timer

WScript.Echo y
WScript.Echo CStr(endTime - startTime)


Function fooBooGoo(p)
    g = p + 1

    fooBooGoo = g
End Function

我得到的输出是:

1000000001
306.6289
1000000001
1554.875

答案 1 :(得分:1)

函数用于执行特定任务或执行特定操作。与其他语言相同,但在OOP中,它们通常被称为“方法”,至少在它们附加到类时。这意味着能够工作。功能是机器可以工作并使事物高效的过程。这是前任。用在一个句子里。机器无法正常工作。或者你可以说的是功能是工作的能力,因此数学定义将是解决方程式/问题的能力。功能意味着工作。

因此,关于使用函数re-cursive会更好,但总体上在基于对象的语言(如vbscript)中,对象应该被创建并设置=以后什么都没有实际使系统有效地消耗内存。

由于

答案 2 :(得分:1)

  • 规则“违反良好做法(不要重复自己,清理程序结构......)以获得速度提升!”很糟糕。
  • 我怀疑甚至有一个现实生活中的VBScript程序只要你内联函数/ subs /方法就变得足够快 - 如果你告诉我两个,我愿意讨论使用/编写扩展的VBScript预处理器宏并为脚本添加行号。
  • 如果速度很重要,您应该提前/持续进行基准测试,并通过选择更好的算法或更好的工具(COM,Net,Shell)来优化速度。
  • 如果(3)没有帮助,请切换到更好的语言。

示例以说明“更好的工具”(#3)的含义:

  • 使用一个ADO连接(创建一次(在VBScript中使用后期绑定))在.CSVs文件夹上执行许多SQL语句,而不是使用FSO,.Readline循环,拆分和复杂IF

  • 使用一个.Net组件(ArrayList,StringBuilder,...)进行许多操作,而不是在本机数组上使用ReDim Preserve或在循环中使用字符串连接

  • 炮轰dir /s /b c:\where\ever\*.vbs而不是(错误/低效)本土/被盗的递归目录漫步者,它会查看所有文件以过滤.vbs