Более быстрая прогулка по каталогу с VB6 Query: проблемы с кэшем и оперативной памятью? - PullRequest
1 голос
/ 26 сентября 2008

Ниже приведена довольно простая функция, которая подсчитывает, сколько файлов на машине. Вызывается на «C: \», для запуска требуется около 5 секунд. Если я не запускал его некоторое время или сначала не запускал программу очистки памяти, в этом случае это занимает 60 секунд или больше. Я бы не подумал, что это может быть кэширование, так как я каждый раз выполняю новое сканирование (т.е. запускаю новый экземпляр программы, поскольку все, что он делает - это сканирование), но, возможно, это связано с распределением памяти? Любые идеи о том, как сделать так быстро бегать каждый раз, или почему это невозможно сделать? Другим программам (например, SpaceMonger) удается получить общее количество файлов за 10 секунд, даже когда я очищаю свой оперативную память или жду долгое время между запусками. Так что, безусловно, есть способ сделать это, но не обязательно в VB.

Private Function countFiles(Name As String) As Long
    On Error GoTo ErrorHandler
    DoEvents
    Const CurMthd = "countFiles"
          Dim retval As Long
13        Dim FindData As win.WIN32_FIND_DATA
14        Dim SearchPath As String
15        Dim FileName As String
17        Dim SearchHandle As Long
          If Right(Name, 1) <> "\" Then Name = Name & "\"
19        SearchPath = Name & "*.*"
20        SearchHandle = win.FindFirstFile(SearchPath, FindData)
          Do
              DoEvents
'             g_Cancel = True
              If g_Cancel Then
                countFiles = retval
                Exit Function
            End If
22            If SearchHandle = win.INVALID_HANDLE_VALUE Or SearchHandle =     ERROR_NO_MORE_FILES Then Exit Do
23            FileName = dsMain.RetainedStrFromPtrA(VarPtr(FindData.cFileName(0)))
24            If AscW(FileName) <> 46 Then
                    If (FindData.dwFileAttributes And win.FILE_ATTRIBUTE_DIRECTORY)     Then
                        retval = retval + countFiles(Name & FileName)
                    Else
                        retval = retval + 1
                    End If
28            End If
29        Loop Until win.FindNextFile(SearchHandle, FindData) = 0
    win.FindClose SearchHandle
    countFiles = retval
    Exit Function
ErrorHandler:
    Debug.Print "Oops: " & Erl & ":" & Err.Description
    Resume Next
End Function

1 Ответ

1 голос
/ 26 сентября 2008

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

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