Memory 使用VB6查询加快目录漫游:缓存和Ram问题?
下面是一个相当简单的函数,它计算一台机器上有多少个文件。调用“C:\”,运行大约需要5秒。除非我有一段时间没有运行它,或者第一次运行ram清除程序,在这种情况下需要60秒或更长时间。我不会想到它可能是缓存,因为我每次都要进行一次新的扫描(即启动一个新的程序,因为它所做的只是这次扫描),但它可能与内存分配有关?有没有关于如何让这种快速奔跑每次都发生,或者为什么不能做到的想法?其他程序(如SpaceMonger)即使在我清除ram或在两次运行之间等待很长时间时,也能在10秒内获得文件总数。所以,肯定有一种方法可以做到这一点,尽管不一定在VB中Memory 使用VB6查询加快目录漫游:缓存和Ram问题?,memory,recursion,vb6,Memory,Recursion,Vb6,下面是一个相当简单的函数,它计算一台机器上有多少个文件。调用“C:\”,运行大约需要5秒。除非我有一段时间没有运行它,或者第一次运行ram清除程序,在这种情况下需要60秒或更长时间。我不会想到它可能是缓存,因为我每次都要进行一次新的扫描(即启动一个新的程序,因为它所做的只是这次扫描),但它可能与内存分配有关?有没有关于如何让这种快速奔跑每次都发生,或者为什么不能做到的想法?其他程序(如SpaceMonger)即使在我清除ram或在两次运行之间等待很长时间时,也能在10秒内获得文件总数。所以,肯定
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清除”程序是我自己编写的一个快速而肮脏的测试,试图缩小速度问题。它非常难看,而且由于它的编写方式,往往会激怒系统。如果操作系统缓存是我的程序速度慢的原因,那么为什么使用其他机制来计算系统上有多少文件的速度要快得多?虽然您在这个问题上可能是对的,但其他软件(以及操作系统本身)已经解决了这个问题。