1

Тема: VBS: Скорость рекурсии VBS

Есть скрипт, который просматривает все содержимое директории по принципу рекурсии. Указываем директорию и вперед.
Просматриваем директорию в которой около 5000 файлов. Скрипт это делает за 45 секунд, а винда практически моментально, когда в Windows указываем поиск *.* скорость намного выше. Вопрос почему? И возможно ли увеличить скорость выполнения рекурсии скрипта в моем случае:





Option Explicit

Dim RetCode
Dim FileMassiv()
Dim a,b,i,objFso


Set objFso = CreateObject("Scripting.FileSystemObject")

Dim PutDataFiles
PutDataFiles = "G:\POS\Pos_Files"

a = Now

Erase FileMassiv
reDim preserve FileMassiv(-1)

call CheckFolderInFolder (PutDataFiles)


b = Now
MsgBox "Готово!" &"A = " &a &" " &"B = " &b




Function CheckFolderInFolder (P1)

    'P1 - передаваемый параметр пути где необходима рекурсия возвращаемый заполненный массив FileMassiv(i)
    
    RetCode = 0
    
    If Ubound(FileMassiv) = -1 Then
        i = -1
    End IF
    
    Dim File,CollectionFolder,CollectionFile,Folder
    
    Set Folder = objFso.GetFolder(P1)
    Set CollectionFolder = Folder.SubFolders
    Set CollectionFile = Folder.Files
    
    If CollectionFile.count > 0 Then
        For Each File In CollectionFile
            ' Сообщение о файле при переборе
            i = i + 1
            reDim preserve FileMassiv(i)
            FileMassiv(i) = File.Path
            'WScript.Echo File.Path &" Размерность =" &i &" Размер массива = " &Ubound(FileMassiv)
        Next
    End If
    
    Dim SubFolder
    
    For Each SubFolder In CollectionFolder
        call CheckFolderInFolder (SubFolder)
    Next

End Function

2 (изменено: Flasher, 2014-09-28 22:05:23)

Re: VBS: Скорость рекурсии VBS

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

3

Re: VBS: Скорость рекурсии VBS

Вопрос почему?

Потому что Вы как упёрлись в массивы, так продолжаете их пользовать, несмотря на дичайшую неэффективность «ReDim Preserve».

И возможно ли увеличить скорость выполнения рекурсии скрипта в моем случае:

В Вашем случае — нет. В Вашем случае всё упирается в пресловутые массивы. Используйте хотя бы коллекцию:

Option Explicit

Dim strRootFolder

Dim objFSO
Dim objDictionary

Dim strFile


strRootFolder = "E:\Песочница"

Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
Set objDictionary = WScript.CreateObject("Scripting.Dictionary")

If objFSO.FolderExists(strRootFolder) Then
    ScanSubFolders objFSO.GetFolder(strRootFolder)
    
    If objDictionary.Count > 0 Then
        For Each strFile In objDictionary.Keys
            WScript.Echo strFile
        Next
        
        WScript.Echo
        WScript.Echo "Total found " & objDictionary.Count & " files."
    Else
        WScript.Echo "Nothing found."
    End If
Else
    WScript.Echo "Source folder [" & strRootFolder & "] not found."
    WScript.Quit 1
End If

objDictionary.RemoveAll

Set objDictionary = Nothing
Set objFSO        = Nothing

WScript.Quit 0
'=======================================================

'=======================================================
Sub ScanSubFolders(objFolder)
    Dim objSubFolder
    Dim objFile
    
    For Each objFile In objFolder.Files
        objDictionary.Add objFile.Path, objFile.Name
    Next
    
    For Each objSubFolder In objFolder.SubFolders
        ScanSubFolders objSubFolder
    Next
End Sub
'=======================================================

4

Re: VBS: Скорость рекурсии VBS

wildwolf007 пишет:

Вопрос почему?

Присоединяясь к ответу alexii, добавлю что дело ещё не только в массивах, но и в том как Windows внутри работает с файловой системой в отличие от реализации FileSystemObject. Интуитивно предполагаю, что на нижнем уровне ОС минимизирует кол-во действий при поисках. Не создаются лишние объекты, не генерятся COM оболочки олицетворяющие каталоги и файлы, нет преобразования переменных Variant и множества проверок на их тип, нет необходимости дёргать QueryInterface у объектов, а главное нет тормозов из-за интерпретации, а выполняются вызовы низкоуровневых API функций, которые адаптированны под Си вызовы. Проводя грубую аналогию - это как общение через трёх-четырёх переводчиков и общение напрямую с человеком на одном языке.

P.S Крайне рекомендую прислушаться к посту Flasher. Это может упростить и ускорить Ваш код в разы.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

5

Re: VBS: Скорость рекурсии VBS

Угу. FindFirst и FindNext — всё богатство выбора.