Memory 使用VB6查询加快目录漫游:缓存和Ram问题?

Memory 使用VB6查询加快目录漫游:缓存和Ram问题?,memory,recursion,vb6,Memory,Recursion,Vb6,下面是一个相当简单的函数,它计算一台机器上有多少个文件。调用“C:\”,运行大约需要5秒。除非我有一段时间没有运行它,或者第一次运行ram清除程序,在这种情况下需要60秒或更长时间。我不会想到它可能是缓存,因为我每次都要进行一次新的扫描(即启动一个新的程序,因为它所做的只是这次扫描),但它可能与内存分配有关?有没有关于如何让这种快速奔跑每次都发生,或者为什么不能做到的想法?其他程序(如SpaceMonger)即使在我清除ram或在两次运行之间等待很长时间时,也能在10秒内获得文件总数。所以,肯定

下面是一个相当简单的函数,它计算一台机器上有多少个文件。调用“C:\”,运行大约需要5秒。除非我有一段时间没有运行它,或者第一次运行ram清除程序,在这种情况下需要60秒或更长时间。我不会想到它可能是缓存,因为我每次都要进行一次新的扫描(即启动一个新的程序,因为它所做的只是这次扫描),但它可能与内存分配有关?有没有关于如何让这种快速奔跑每次都发生,或者为什么不能做到的想法?其他程序(如SpaceMonger)即使在我清除ram或在两次运行之间等待很长时间时,也能在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
私有函数countFiles(名称为字符串)的长度
关于错误转到错误处理程序
多芬特
Const CurMthd=“countFiles”
暗淡的后退
13作为win.WIN32\u FIND\u数据的Dim FindData
14以字符串形式搜索路径
15作为字符串的文件名
17.与手柄一样长
如果正确(名称,1)“\”则名称=名称&“\”
19 SearchPath=Name&“****”
20 SearchHandle=win.FindFirstFile(SearchPath,FindData)
做
多芬特
'g_Cancel=True
如果你取消的话
countFiles=retval
退出功能
如果结束
22如果SearchHandle=win.INVALID\u HANDLE\u VALUE或SearchHandle=ERROR\u NO\u MORE\u文件,则退出Do
23 FileName=dsMain.RetainedStrFromPtrA(VarPtr(FindData.cFileName(0)))
24如果AscW(文件名)46则
如果(FindData.dwFileAttributes和win.FILE\u ATTRIBUTE\u目录),则
retval=retval+countFiles(名称和文件名)
其他的
retval=retval+1
如果结束
28如果结束
29循环直到win.FindNextFile(SearchHandle,FindData)=0
win.FindClose搜索句柄
countFiles=retval
退出功能
错误处理程序:
Debug.Print“Oops:&Erl&“:”&Err.Description
下一步继续
端函数

操作系统本身缓存从磁盘读取的数据。这完全超出了你的程序范围,你实际上无法控制它。因此,当您运行“ram清除”程序时,它会清除这些缓存。这就是为什么那些“ram清除”程序通常是完全无用的——正如您所见,清空缓存会使程序运行变慢。

操作系统本身会缓存从磁盘读取的数据。这完全超出了你的程序范围,你实际上无法控制它。因此,当您运行“ram清除”程序时,它会清除这些缓存。这就是为什么那些“ram清除”程序通常是完全无用的——正如您所看到的,清空缓存会使您的程序运行变慢。

我自己编写的“ram清除”程序是一个快速而肮脏的测试,试图缩小速度问题。它非常难看,而且由于它的编写方式,往往会激怒系统。如果操作系统缓存是我的程序速度慢的原因,那么为什么使用其他机制来计算系统上有多少文件的速度要快得多?虽然你对这个问题的看法可能是对的,但其他软件(以及操作系统本身)已经解决了这个问题。“ram清除”程序是我自己编写的一个快速而肮脏的测试,试图缩小速度问题。它非常难看,而且由于它的编写方式,往往会激怒系统。如果操作系统缓存是我的程序速度慢的原因,那么为什么使用其他机制来计算系统上有多少文件的速度要快得多?虽然您在这个问题上可能是对的,但其他软件(以及操作系统本身)已经解决了这个问题。