2014-02-20 1 views
0

У меня есть много вспомогательных процедур и функций, как эти:влияние на производительность вызова много функций в 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 это было названо проблемой производительности. Могу ли я просто пойти дальше и создать зиллионы маленьких вложенных функций, чтобы сделать все или использовать их немного более экономно?

ответ

1
  • правила «нарушает хорошую практику (не повторять себя, чистую структуру программы, ...) для прироста скорости!» плохо.
  • Я сомневаюсь, что существует даже одна настоящая программа VBScript, которая становится достаточно быстрой, как только вы встроите функции/subs/methods - если вы покажете мне два, я готов обсудить использование/запись препроцессора для VBScript, который расширяется макросов и добавляет нумерацию строк в скрипты.
  • Если скорость важна, вы должны ранжировать/непрерывно и оптимизировать скорость, выбирая лучшие алгоритмы или лучшие инструменты (COM, Net, Shell).
  • Если (3) не помогает, переключитесь на лучший язык.

Образцов для иллюстрации того, что я имею в виду под "более совершенными инструментами" (# 3):

  • используя одно соединения ADO (созданное один раз (с поздним связыванием в VBScript)) для выполнения многого SQL операторы в папке с .SSV вместо использования FSO, .Readline loop, Splits и complex IFs

  • с использованием одного компонента .Net (ArrayList, StringBuilder, ...) для многих операций вместо использования ReDim Preserve on собственные массивы или конкатенация строк в цикле

  • обстрел dir /s /b c:\where\ever\*.vbs вместо (неисправный/неэффективный) доморощенный/украденный рекурсивный хостинг каталогов, который просматривает все файлы для фильтрации.VBS

+0

Спасибо за этот ответ. Я согласен с пунктами 1, 2 и 3. Пункт 4 не является вариантом для того, над чем я работаю. Мне интересно, какой уровень детализации функций они перестают быть хорошей практикой программирования? – neelsg

+0

Должно быть немного накладных расходов при вызове Sub или Function VBScript. Я не согласен с № 3, если он все равно говорит о вызове COM из VBScript. Поскольку VBScript не поддерживает раннее связывание, создание ряда поздних связанных COM-вызовов, которые требуют просмотра VTable через интерфейсы IDispatch, является самым надежным способом вызвать замедление. Это включает библиотеки «made-for-VBScript», такие как Shell, Network и FileSystemObject. Секции профиля вашего кода, чтобы найти истинные узкие места. Бритье на 1/2 секунды с суб, которое используется один раз, прекрасно. Но лучше использовать бритье на 100 мс, что называется 1000s раз. – Bond

1

Функции используются для выполнения определенной задачи или для выполнения конкретной операции. То же, что и на других языках, но в ООП их обычно называют «методами», по крайней мере, когда они привязаны к классу. Это значит иметь возможность работать. Функция - это процесс, в котором машина может работать и эффективно работать. вот пример. который используется в предложении. машина не будет работать правильно. Или то, что вы могли бы сказать, это функция - способность работать, поэтому математическое определение будет способностью решать уравнение/проблему. Функция означает работу.

Так что в отношении использования функции re-cursive было бы лучше, но в целом на объектно-ориентированных языках, таких как vbscript, объекты должны быть созданы и установлены = ничего позже, чтобы фактически эффективно использовать память системы.

Благодаря

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 
Смежные вопросы