<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Скорость рекурсии VBS]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=10004</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=10004&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Скорость рекурсии VBS».]]></description>
		<lastBuildDate>Mon, 29 Sep 2014 11:54:17 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86839#p86839</link>
			<description><![CDATA[<p>Угу. FindFirst и FindNext — всё богатство выбора.</p>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Mon, 29 Sep 2014 11:54:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86839#p86839</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86836#p86836</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (Xameleon)]]></author>
			<pubDate>Mon, 29 Sep 2014 08:17:32 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86836#p86836</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86831#p86831</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (alexii)]]></author>
			<pubDate>Sun, 28 Sep 2014 22:30:12 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86831#p86831</guid>
		</item>
		<item>
			<title><![CDATA[Re: VBS: Скорость рекурсии VBS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86826#p86826</link>
			<description><![CDATA[<p>Несопоставимые вещи сравниваете. Винда индексирует файлы (если преднамеренно не отключалась индексация), что увеличивает скорость поиска в десятки раз. Я уже некогда указывал на <a href="http://script-coding.com/WSH/Shell.html#5.3.3.">такой метод</a>, но его применимость зависит от кокретных задач и заданных условий. Понятно, что цикличные переборы маскам будут существенно проигрывать.</p>]]></description>
			<author><![CDATA[null@example.com (Flasher)]]></author>
			<pubDate>Sun, 28 Sep 2014 18:04:56 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86826#p86826</guid>
		</item>
		<item>
			<title><![CDATA[VBS: Скорость рекурсии VBS]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=86817#p86817</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (wildwolf007)]]></author>
			<pubDate>Sun, 28 Sep 2014 16:24:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=86817#p86817</guid>
		</item>
	</channel>
</rss>
