<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBS: Скорость рекурсии VBS]]></title>
	<link rel="self" href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10004&amp;type=atom" />
	<updated>2014-09-29T11:54:17Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.script-coding.com/viewtopic.php?id=10004</id>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86839#p86839" />
			<content type="html"><![CDATA[<p>Угу. FindFirst и FindNext — всё богатство выбора.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2014-09-29T11:54:17Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86839#p86839</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86836#p86836" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>wildwolf007 пишет:</cite><blockquote><p>Вопрос почему?</p></blockquote></div><p>Присоединяясь к ответу <strong>alexii</strong>, добавлю что дело ещё не только в массивах, но и в том как Windows внутри работает с файловой системой в отличие от реализации <strong>FileSystemObject</strong>. <span class="bbu">Интуитивно предполагаю</span>, что на нижнем уровне ОС минимизирует кол-во действий при поисках. Не создаются лишние объекты, не генерятся COM оболочки олицетворяющие каталоги и файлы, нет преобразования переменных <strong>Variant</strong> и множества проверок на их тип, нет необходимости дёргать <strong>QueryInterface</strong> у объектов, а главное нет тормозов из-за интерпретации, а выполняются вызовы низкоуровневых API функций, которые адаптированны под Си вызовы. Проводя грубую аналогию - это как общение через трёх-четырёх переводчиков и общение напрямую с человеком на одном языке.</p><p>P.S Крайне рекомендую прислушаться к посту <strong>Flasher</strong>. Это может упростить и ускорить Ваш код в разы.</p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2014-09-29T08:17:32Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86836#p86836</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86831#p86831" />
			<content type="html"><![CDATA[<div class="quotebox"><blockquote><p>Вопрос почему?</p></blockquote></div><p>Потому что Вы как упёрлись в массивы, так продолжаете их пользовать, несмотря на дичайшую неэффективность «ReDim Preserve».</p><div class="quotebox"><blockquote><p>И возможно ли увеличить скорость выполнения рекурсии скрипта в моем случае:</p></blockquote></div><p>В Вашем случае — нет. В Вашем случае всё упирается в пресловутые массивы. Используйте хотя бы коллекцию:<br /></p><div class="codebox"><pre><code>Option Explicit

Dim strRootFolder

Dim objFSO
Dim objDictionary

Dim strFile


strRootFolder = &quot;E:\Песочница&quot;

Set objFSO = WScript.CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set objDictionary = WScript.CreateObject(&quot;Scripting.Dictionary&quot;)

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

objDictionary.RemoveAll

Set objDictionary = Nothing
Set objFSO        = Nothing

WScript.Quit 0
&#039;=======================================================

&#039;=======================================================
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
&#039;=======================================================
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2014-09-28T22:30:12Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86831#p86831</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86826#p86826" />
			<content type="html"><![CDATA[<p>Несопоставимые вещи сравниваете. Винда индексирует файлы (если преднамеренно не отключалась индексация), что увеличивает скорость поиска в десятки раз. Я уже некогда указывал на <a href="http://script-coding.com/WSH/Shell.html#5.3.3.">такой метод</a>, но его применимость зависит от кокретных задач и заданных условий. Понятно, что цикличные переборы маскам будут существенно проигрывать.</p>]]></content>
			<author>
				<name><![CDATA[Flasher]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=27593</uri>
			</author>
			<updated>2014-09-28T18:04:56Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86826#p86826</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBS: Скорость рекурсии VBS]]></title>
			<link rel="alternate" href="https://forum.script-coding.com/viewtopic.php?pid=86817#p86817" />
			<content type="html"><![CDATA[<p>Есть скрипт, который просматривает все содержимое директории по принципу рекурсии. Указываем директорию и вперед.<br />Просматриваем директорию в которой около 5000 файлов. Скрипт это делает за 45 секунд, а винда практически моментально, когда в Windows указываем поиск *.* скорость намного выше. Вопрос почему? И возможно ли увеличить скорость выполнения рекурсии скрипта в моем случае:</p><div class="codebox"><pre><code>



Option Explicit

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


Set objFso = CreateObject(&quot;Scripting.FileSystemObject&quot;)

Dim PutDataFiles
PutDataFiles = &quot;G:\POS\Pos_Files&quot;

a = Now

Erase FileMassiv
reDim preserve FileMassiv(-1)

call CheckFolderInFolder (PutDataFiles)


b = Now
MsgBox &quot;Готово!&quot; &amp;&quot;A = &quot; &amp;a &amp;&quot; &quot; &amp;&quot;B = &quot; &amp;b




Function CheckFolderInFolder (P1)

    &#039;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 &gt; 0 Then
        For Each File In CollectionFile
            &#039; Сообщение о файле при переборе
            i = i + 1
            reDim preserve FileMassiv(i)
            FileMassiv(i) = File.Path
            &#039;WScript.Echo File.Path &amp;&quot; Размерность =&quot; &amp;i &amp;&quot; Размер массива = &quot; &amp;Ubound(FileMassiv)
        Next
    End If
    
    Dim SubFolder
    
    For Each SubFolder In CollectionFolder
        call CheckFolderInFolder (SubFolder)
    Next

End Function

</code></pre></div>]]></content>
			<author>
				<name><![CDATA[wildwolf007]]></name>
				<uri>https://forum.script-coding.com/profile.php?id=30994</uri>
			</author>
			<updated>2014-09-28T16:24:47Z</updated>
			<id>https://forum.script-coding.com/viewtopic.php?pid=86817#p86817</id>
		</entry>
</feed>
