- Сообщения
- 8,673
- Репутация
- 2,487
До сих пор использовал версию _DirGetSizeEx с FileFindFirstFile (есть на оф. форуме моя модификация этой функций от KaFu, но он (оф. сайт) на данный момент лежит).
Но тут недавно наткнулся на метод с vbs, который работает значительно быстрее обычной DirGetSize, и даже быстрее _DirGetSizeEx, которая считалась самой быстрой в AutoIt:
Следующий тест показывает значительную разницу в скорости работы функций, как при первом запуске (до кеширования), так и при последующих запусках (по крайней мере на моей машине):
P.S
Пытался сделать подобную функцию через ком. строку (Dir...), но так ничего и не вышло, из за ограничений в локализаций.
Но тут недавно наткнулся на метод с vbs, который работает значительно быстрее обычной DirGetSize, и даже быстрее _DirGetSizeEx, которая считалась самой быстрой в AutoIt:
Код:
ConsoleWrite(_DirGetSizeEx(@WindowsDir) & @LF)
Func _DirGetSizeEx($sPath)
Local $aPathIsDir, $iSize, $iErr = 0, $iRet = 0
If Not $sPath Then
Return SetError(1)
EndIf
If Not IsDeclared("o_DGSE_FSO") Then
Global $o_DGSE_FSO = ObjCreate("Scripting.FileSystemObject")
Global $o_DGSE_ErrEvent = ObjEvent("AutoIt.Error", "_DirGetSizeEx")
EndIf
$aPathIsDir = DllCall('shlwapi.dll', 'int', 'PathIsDirectoryW', 'wstr', $sPath)
If Not $aPathIsDir[0] Then
Return SetError(-1, 0, 0)
EndIf
If IsObj($o_DGSE_FSO) Then
$iSize = $o_DGSE_FSO.GetFolder($sPath).Size
If Not @error Then
$iRet = $iSize
EndIf
EndIf
If $iRet = 0 Then
$iRet = DirGetSize($sPath)
If @error Then
$iErr = 1
$iRet = 0
EndIf
EndIf
$o_DGSE_ErrEvent = 0
Return SetError($iErr, 0, $iRet)
EndFunc
Следующий тест показывает значительную разницу в скорости работы функций, как при первом запуске (до кеширования), так и при последующих запусках (по крайней мере на моей машине):
Код:
;========= Для предотвращения ложного теста
_Test_DirGetSize()
_Test_DirGetSizeEx()
;========= Для предотвращения ложного теста
_SpeedTest("_Test_DirGetSize")
_SpeedTest("_Test_DirGetSizeEx")
Func _Test_DirGetSize()
DirGetSize(@WindowsDir)
EndFunc
Func _Test_DirGetSizeEx()
_DirGetSizeEx(@WindowsDir)
EndFunc
Func _SpeedTest($sTestFunc, $iRepeat_Test = 5)
Local $aTests[$iRepeat_Test+1] = [$iRepeat_Test]
Local $iTotal_Tests = 0
For $x = 1 To $iRepeat_Test
$iTimer = TimerInit()
;=== CODE TEST ====
Call($sTestFunc)
;=== CODE TEST ===
$aTests[$x] = Round(TimerDiff($iTimer), 3)
$iTotal_Tests += $aTests[$x]
ConsoleWrite("Test #" & $x & ": " & $aTests[$x] & " ms" & @LF)
Next
$iAverage = Round($iTotal_Tests / $iRepeat_Test, 3)
ConsoleWrite("======================" & @LF & "Tests Average For [" & $sTestFunc & "]: " & $iAverage & @LF & "======================" & @LF & @LF)
EndFunc
P.S
Пытался сделать подобную функцию через ком. строку (Dir...), но так ничего и не вышло, из за ограничений в локализаций.