Оптимизация vbscript: как ускорить запись файла - PullRequest
0 голосов
/ 27 января 2009

Ниже приводится обычная функция журнала, которую я использую во многих моих скриптах, которые я соответствующим образом изменяю. Я чувствую, что он пишет слишком медленно. У меня есть 3 вопроса:

  1. Есть идеи, как это оптимизировать, чтобы быстрее писать?
  2. Будет ли быстрее сначала сохранить весь текст в строке, а затем запустить функцию OutputToLog, или быстрее будет выполнять OutputToLog каждый раз, когда мне потребуется вставить строку в текстовый файл?
  3. Если дисковое пространство не было фактором, возможно ли исчерпать память при записи в текстовый файл во время выполнения ... что заставляет скрипт выполняться медленнее и медленнее?

Вот моя функция VBScript

Function OutputToLog (strToAdd)  
    Dim strDirectory,strFile,strText, objFile,objFolder,objTextFile,objFSO
    strDirectory = "c:\log"
    strFile = "\log-"& StampNow &  ".bat"
    'strText = "test"
    strText = strToAdd

    ' Create the File System Object
    Set objFSO = CreateObject("Scripting.FileSystemObject")

    ' Check that the strDirectory folder exists
    If objFSO.FolderExists(strDirectory) Then
       Set objFolder = objFSO.GetFolder(strDirectory)
    Else
       Set objFolder = objFSO.CreateFolder(strDirectory)
       'WScript.Echo "Just created " & strDirectory
    End If

    If objFSO.FileExists(strDirectory & strFile) Then
       Set objFolder = objFSO.GetFolder(strDirectory)
    Else
       Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
       'Wscript.Echo "Just created " & strDirectory & strFile
    End If

    set objFile = nothing
    set objFolder = nothing
    ' OpenTextFile Method needs a Const value
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8

    Set objTextFile = objFSO.OpenTextFile _
    (strDirectory & strFile, ForAppending, True)

    ' Writes strText every time you run this VBScript
    objTextFile.WriteLine(strText)
    objTextFile.Close
End Function

заранее спасибо

Ответы [ 4 ]

1 голос
/ 02 февраля 2009

Я думаю, что вы захотите как создать свои объекты FSO, так и открыть файл журнала вне функции OutputToLog. Это может не сэкономить много времени, но зачем создавать объекты, открывать и закрывать файлы при каждой записи?

В противном случае, если вы хотите сохранить функции как есть, выполнение одной записи должно быть быстрее.

0 голосов
/ 02 февраля 2009

Не закрывайте файл между вызовами, пусть texttream-объект позаботится о закрытии, когда он завершится.

Dim OutputToLogFileObject
Function OutputToLog (strToAdd)  
    Dim strDirectory,strFile,strText, objFile,objFolder,objTextFile,objFSO
    If IsEmpty(OutputToLogFileObject) Then
        strDirectory = "c:\log"
        strFile = "\log-"& StampNow &  ".bat"
        'strText = "test"
        strText = strToAdd

        ' Create the File System Object
        Set objFSO = CreateObject("Scripting.FileSystemObject")

        ' Check that the strDirectory folder exists
        If objFSO.FolderExists(strDirectory) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFolder = objFSO.CreateFolder(strDirectory)
           'WScript.Echo "Just created " & strDirectory
        End If

        If objFSO.FileExists(strDirectory & strFile) Then
           Set objFolder = objFSO.GetFolder(strDirectory)
        Else
           Set objFile = objFSO.CreateTextFile(strDirectory & strFile)
           'Wscript.Echo "Just created " & strDirectory & strFile
        End If

        set objFile = nothing
        set objFolder = nothing
        ' OpenTextFile Method needs a Const value
        ' ForAppending = 8 ForReading = 1, ForWriting = 2
        Const ForAppending = 8

        Set OutputToLogFileObject = objFSO.OpenTextFile _
        (strDirectory & strFile, ForAppending, True)
    End If
    OutputToLogFileObject.WriteLine strText
 End Function
0 голосов
/ 27 января 2009

Все ваши папки / файлы проверяются и создаются один раз в подготовительной функции, затем вы можете просто добавить файл журнала в безопасное место, зная, что он там будет? Кроме того, вы сможете создать объект fso один раз.

Что-то вроде следующего (непроверенный код)

Dim loggerFSO

Function PrepLog
    dim objFolder
    ' Create the File System Object
    if loggerFSO is nothing then Set loggerFSO = CreateObject("Scripting.FileSystemObject")

    ' Check that the strDirectory folder exists
    If loggerFSO.FolderExists(strDirectory) Then
       Set objFolder = loggerFSO.GetFolder(strDirectory)
    Else
       Set objFolder = loggerFSO.CreateFolder(strDirectory)
       'WScript.Echo "Just created " & strDirectory
    End If

    If loggerFSO.FileExists(strDirectory & strFile) Then
       ' do nothing
    Else
       loggerFSO.CreateTextFile(strDirectory & strFile)
       'Wscript.Echo "Just created " & strDirectory & strFile
    End If
End function

Function OutputToLog (strToAdd)  
    Dim strDirectory,strFile,strText, objTextFile
    strDirectory = "c:\log"
    strFile = "\log-"& StampNow &  ".bat"
    'strText = "test"
    strText = strToAdd

    ' Create the File System Object
    if loggerFSO is nothing then Set loggerFSO = CreateObject("Scripting.FileSystemObject")

    ' OpenTextFile Method needs a Const value
    ' ForAppending = 8 ForReading = 1, ForWriting = 2
    Const ForAppending = 8

    Set objTextFile = loggerFSO.OpenTextFile _
    (strDirectory & strFile, ForAppending, True)

    ' Writes strText every time you run this VBScript
    objTextFile.WriteLine(strText)
    objTextFile.Close
End Function
0 голосов
/ 27 января 2009

Если вы делаете много небольших записей, то рефакторинг проверок на наличие FolderExists и FileExists немного поможет. Может быть, попытаться записать в файл, перехватывая любые ошибки, и проверить наличие FolderExists и FileExists в обработчике ошибок и создать их при необходимости?

Будет быстрее вывести одну большую строку, чем несколько маленьких, но вы должны сопоставить это с возможностью потери записей журнала в случае сбоя вашей программы.

Память не должна быть проблемой, если вы не записываете в файл огромную строку, и, вероятно, даже тогда.

Поскольку вы добавляете файл, чем дольше файл журнала, тем дольше будет выполняться запись, поскольку (AFAIK) каждый раз необходимо перезаписывать весь файл. Это еще одна причина для того, чтобы писать более длинные строки реже.

Не могли бы вы вместо этого использовать журнал событий Windows?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...