Автор Тема: _DirGetSizeEx - Ускорение получения размера каталога  (Прочитано 5692 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
До сих пор использовал версию _DirGetSizeEx с FileFindFirstFile (есть на оф. форуме моя модификация этой функций от KaFu, но он (оф. сайт) на данный момент лежит).

Но тут недавно наткнулся на метод с vbs, который работает значительно быстрее обычной DirGetSize, и даже быстрее _DirGetSizeEx, которая считалась самой быстрой в AutoIt:

Код: 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


Следующий тест показывает значительную разницу в скорости работы функций, как при первом запуске (до кеширования), так и при последующих запусках (по крайней мере на моей машине):

(нажмите для показа/скрытия)

P.S
Пытался сделать подобную функцию через ком. строку (Dir...), но так ничего и не вышло, из за ограничений в локализаций.
« Последнее редактирование: Июнь 11, 2011, 16:35:23 от CreatoR »


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Русское сообщество AutoIt


Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR,
Я несколько раз менял местами
Код: AutoIt [Выделить]
;...
_SpeedTest("_Test_DirGetSizeEx")
; и
_SpeedTest("_Test_DirGetSize")
;...

В результате (у меня) та функция, которая проверяется второй всегда отрабатывает быстрее первой. Почему?  :wacko:

PS
А если запускать их в цикле
Код: AutoIt [Выделить]
For $i = 1 To 5
    _SpeedTest("_Test_DirGetSizeEx")
    _SpeedTest("_Test_DirGetSize")
Next

То (у меня) первый проход - вторая функция всегда быстрее, а в следующих проходах, независимо от того, какая функция стоит первой, _DirGetSizeEx() отрабатывает быстрее.  :wacko:  :wacko:
« Последнее редактирование: Июнь 10, 2011, 09:58:57 от madmasles »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madmasles  [?]
Цитировать
В результате (у меня) та функция, которая проверяется второй всегда отрабатывает быстрее первой. Почему?
Это только при первом запуске (с одного скрипта на одну и туже папку), или нет?

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR  [?]
Цитировать
Это только при первом запуске (с одного скрипта на одну и туже папку), или нет?
На одну и ту же папку запускал раз по 10 с интервалом ~30 секунд, меняя функции местами.

Решил проверить на Windows 7 (до этого проверял на XP SP3). _DirGetSizeEx() у меня выдает ошибку:
Цитировать
: ==> The requested action with this object has failed.:
Return $o_DGSE_FSO.GetFolder($sPath).Size
Return $o_DGSE_FSO.GetFolder($sPath).Size^ ERROR
:wacko:  :wacko:  :wacko:
« Последнее редактирование: Июнь 10, 2011, 10:27:26 от madmasles »

Русское сообщество AutoIt

Re: _DirGetSizeEx - Ускорение получения размера каталога
« Ответ #3 Отправлен: Июнь 10, 2011, 10:04:42 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madmasles  [?]
Цитировать
На одну и ту же папку запускал раз по 10 с интервалом ~30 секунд, меняя функции местами.
А если ещё кроме этого, поставить паузу в секунду в начало скрипта?


Добавлено: Июнь 10, 2011, 10:27:08
madmasles
И ещё, Вы уверены что функция _DirGetSizeEx использует FileSystemObject, а не переходит к проверке встроенной DirGetSize?

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2314
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
CreatoR  [?]
Цитировать
Вы уверены что функция _DirGetSizeEx использует FileSystemObject
Проверял, используется именно Scripting.FileSystemObject.
Поставил паузу в начало, результат не изменился.

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7809

  • Автор темы
  • Репутация: 2281
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
madmasles  [?]
Цитировать
Решил проверить на Windows 7 (до этого проверял на XP SP3). _DirGetSizeEx() у меня выдает ошибку
Да, это связано с правами доступа к системной папке (даже из под администратора). Попробуйте например @TempDir, должно сработать.

Функцию поправил, если подобная ошибка и возникнет, то размер будет возвращаться встроенным методом (DirGetSize).

Оффлайн Malderin [?]

  • Новичок
  • *
  • Сообщений: 55
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Действительно для папок на локальном ПК работает значительно быстрее, но вот для сетевых, к сожалению, работает даже медленнее. Как проверял.
Есть у меня некий скрипт который я использую для мониторинга сетевой папки, которая содержит в себе именные папки работников. Цель у меня была получить общий размер этой папки и размеры каждой вложенной папки в отдельности (потом это загоняется в эксель). После запуска проверки размера время определялось через TimerDiff.
Общий размер папки примерно 36Гб, вложенных папок первого уровня 87 (папок и подпапок всего 5161).
Результат такой (3 запуска проверки подряд без остановки скрипта):
1. Скрипт на DirGetSize - 12,15 сек; 11,85 сек, 11,97 сек;
2. Скрипт на _DirGetSizeEx - 15.13 сек, 14,64 сек, 14,77 сек.
Вывод - имеет смысл использовать данную функцию, но конечно надо смотреть по ситуации как быстрее.

Русское сообщество AutoIt

Re: _DirGetSizeEx - Ускорение получения размера каталога
« Ответ #7 Отправлен: Март 03, 2017, 11:19:15 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
9 Ответов
4771 Просмотров
Последний ответ Ноябрь 03, 2010, 13:41:39
от Alexander
3 Ответов
6634 Просмотров
Последний ответ Январь 06, 2011, 16:15:04
от Viktor217
8 Ответов
4406 Просмотров
Последний ответ Апрель 11, 2013, 14:37:14
от madmasles
0 Ответов
699 Просмотров
Последний ответ Январь 14, 2015, 12:06:56
от Нубокодер
10 Ответов
1324 Просмотров
Последний ответ Июнь 25, 2015, 15:44:08
от lelik_keo
8 Ответов
1430 Просмотров
Последний ответ Июль 03, 2015, 17:15:53
от InnI
4 Ответов
1371 Просмотров
Последний ответ Июль 08, 2015, 22:41:56
от Vovsla
56 Ответов
9736 Просмотров
Последний ответ Декабрь 22, 2016, 23:58:03
от eil
1 Ответов
799 Просмотров
Последний ответ Февраль 10, 2016, 22:42:15
от firex
0 Ответов
583 Просмотров
Последний ответ Февраль 11, 2016, 05:47:00
от Yashied