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

在vbscript中调用大量函数对性能的影响,vbscript,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

我有很多子例程和函数,如下所示:

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
或者这个:

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
Sub-DoExp(Exp,ErrTag)
'执行带有错误处理和调试的HS.Exp
呃,明白了
出错时继续下一步
特快
如果错误号为0,则
日志错误“HS.Exp”“”和Exp&“”,标记:“&ErrTag”
呃,明白了
ElseIf LogEnablePut然后
日志“Put:HS.Exp”“&Exp&”“,标记:&ErrTag”
如果结束
错误转到0
端接头
它们实际上是一行程序,做的不多,但我用了很多次,所以我不想每次都打印出来。我也经常使用递归函数


由于速度和内存使用对我的应用程序至关重要,我想知道的是,在
vbscript
中调用函数或子函数是否会对性能产生相当大的影响?我知道在PHP中,这是一个性能问题。我是否可以继续创建无数的小型嵌套函数来完成所有任务,还是应该更谨慎地使用它们?

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

所以,关于使用函数re-cursive会更好,但总的来说,在基于对象的语言(如vbscript)中,应该创建对象并设置=不迟,以使系统有效地消耗内存

谢谢

  • “违反良好实践(不要重复你自己,清理程序结构,…)以提高速度”的规则是不好的
  • 我怀疑现实生活中是否有一个VBScript程序能够在内联函数/子函数/方法后变得足够快-如果你给我看两个,我愿意讨论为VBScript使用/编写一个预处理器来扩展宏并为脚本添加行号
  • 如果速度很重要,您应该尽早/持续地进行基准测试,并通过选择更好的算法或更好的工具(COM、Net、Shell)来优化速度
  • 如果(3)没有帮助,请切换到更好的语言
示例说明我所说的“更好的工具”(#3)的含义:

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

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

  • 退出到
    dir/s/b c:\where\ever\*.vbs
    ,而不是一个(错误/低效)自产/被盗的递归目录遍历器,它查看所有文件以过滤.vbs


根据我的经验,在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、2和3点。第4点不是我正在研究的选项。我想知道函数的粒度在什么程度上不再是好的编程实践?调用VBScript子函数或函数应该不会有太大的开销。我不同意#3,如果他说的是从VBScript调用COM。由于VBScript不支持早期绑定,因此进行大量需要通过IDispatch接口进行VTable查找的后期绑定COM调用是导致速度减慢的最可靠的方法。其中包括“为VBScript制作”库,如Shell、网络和FileSystemObject。分析代码的各个部分以找到真正的瓶颈。剃掉一次用过的接头1/2秒就可以了。但是从一个叫做1000次的潜艇上剃100毫秒更好。