Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2015, 06:31   #1
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию Самый быстрый способ получить размер файла

Привет!
Вот, нашёл вот такой пример получить размер файла.
Цель переплюнуть этот пример по скорости.
Предлагайте свои варианты.
Спасибо.

Код:
function FileGetSize(const aFileName: string): Int64;
var AttributeData: TWin32FileAttributeData;
begin
  if GetFileAttributesEx(PChar(aFileName), GetFileExInfoStandard, @AttributeData) then
  begin
    Int64Rec(Result).Lo := AttributeData.nFileSizeLow;
    Int64Rec(Result).Hi := AttributeData.nFileSizeHigh;
  end
  else
    Result := -1;
end;


Вариации с
Код:
CreateFile...GetFileSize
не предлагать, ибо уже затестировано и с негодованием отметено.
Код:
function FileGetSizeasdfasdf(const aFileName: string): Int64;
var
  FileHandle: THandle;
  FileSizeLow, FileSizeHigh: DWORD;
begin         // чудовищно медленный способ

  FileHandle := CreateFile(PChar(aFileName), GENERIC_READ, FILE_SHARE_READ,
    nil, OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0);
  if FileHandle <> INVALID_HANDLE_VALUE then
  begin
    FileSizeLow := Windows.GetFileSize(FileHandle, @FileSizeHigh);
    Int64Rec(Result).Hi := FileSizeHigh;
    Int64Rec(Result).Lo := FileSizeLow;
    CloseHandle(FileHandle);
  end
  else
    Result := -1;
end;
xexxex вне форума Ответить с цитированием
Старый 10.04.2015, 06:47   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
переплюнуть этот пример по скорости.
Э-э-э... А какова скорость этого примера можно поинтересоваться?
Цитата:
Предлагайте свои варианты.
FindFirst(). Не?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2015, 07:01   #3
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Stilet - погонял в циклах разные варианты для сравнения...

Код:
procedure TestFileSizes;
const
  Count = 100000;
  aFileName: string = 'D:\Projects\_1CCCCCCC\HmBG.exe';
var J: Integer;
    Ticks: DWORD;
    FileSize: Int64;
    Res: string;
begin

  Ticks := GetTickCount;
  for J := 0 to Count-1 do
  begin
    FileSize := FileGetSize(aFileName);  // первый вариант
    if FileSize > 0 then;
  end;
  Res := Res + #13 + FloatToStr(GetTickCount - Ticks);


  Ticks := GetTickCount;
  for J := 0 to Count-1 do
  begin
    FileSize := FileGetSize1(aFileName); // второй вариант
    if FileSize > 0 then;
  end;
  Res := Res + #13 + FloatToStr(GetTickCount - Ticks);


  MsgBox(Res);    // смотрим результат в секундах
end;
xexxex вне форума Ответить с цитированием
Старый 10.04.2015, 07:18   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А зачем? Смысл такого исследования?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2015, 14:19   #5
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Stilet - ну, как зачем, странный вопрос. Например, чтобы угомонить копьеломателей, и сравнением вариантов выявить\найти на данный\текущий момент истории(да, не побоюсь этого слова) самый быстрый способ получения размера файла, и внедрить\популяризировать его в массы(эка, как загнул!)... А чего, вреда от этого нет, только явно (перспективная) польза... И это уже достаточный смысл. Просто естественное стремление человека к совершенству(во всём), если хочешь.

пс. уже слышу\предвкушаю неприемлемые мной (напрасные) тезисы, мол, про корабли бороздящие просторы, и про не(из)мерянные памяти и быстрые процы - и мол, все эти изыскания\поползновения в поиске быстрого получения размера файла - мол, большой роли\выигрыша не представляют... Не согласен.
xexxex вне форума Ответить с цитированием
Старый 10.04.2015, 14:51   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

На каком устройстве тестировался способ? HDD, SSD, FDD, CD, DVD, флешка?
Arigato на форуме Ответить с цитированием
Старый 10.04.2015, 16:48   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Гоняя один и тот же файл, все данные будут извлекаться из кеша диска.
Кошерны способ - создать папку, где будут 100/500 файлов, потом извлекать данные для каждого из них (без обхода папки)...

Согласен со Стилетом - скорее всего FindFirstFile самый быстрый способ, ибо все остальные должны будут так или иначе искать файл на диске, т.е. делать FindFirstFile...
waleri вне форума Ответить с цитированием
Старый 10.04.2015, 17:41   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
чтобы угомонить копьеломателей
Ради холливара??? Пф...
Чем только черти не шутят, когда людям заняться нечем...
Хочешь суперпупер? - напиши драйвер FS. Ей богу - скоростяка будет немерянная.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 10.04.2015, 17:53   #9
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Ещё один перспективный кандидат оказался чудовищно медленным:
Код:
function FileGetSize1(const aFileName: string): Int64;
var FindHandle: THandle;
    DataData: TWin32FindData;
begin
  FindHandle := FindFirstFile(PChar(aFileName), DataData);
  if FindHandle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(FindHandle);
    Int64Rec(Result).Lo  := DataData.nFileSizeLow;
    Int64Rec(Result).Hi := DataData.nFileSizeHigh;
  end
  else
    Result := -1;
end;
- и понятно, почему, ибо TWin32FindData содержит текстовые поля, которые (напрасно)(бесполезно)заполняются виндосом.


Чемпион по скорости получения размера файла всё ещё непобедим:
Код:
function FileGetSize(const aFileName: string): Int64;
var AttributeData: TWin32FileAttributeData;
begin
  if GetFileAttributesEx(PChar(aFileName), GetFileExInfoStandard, @AttributeData) then
  begin
    Int64Rec(Result).Lo := AttributeData.nFileSizeLow;
    Int64Rec(Result).Hi := AttributeData.nFileSizeHigh;
  end
  else
    Result := -1;
end;

Последний раз редактировалось xexxex; 10.04.2015 в 18:07.
xexxex вне форума Ответить с цитированием
Старый 10.04.2015, 18:04   #10
xexxex
Пользователь
 
Регистрация: 31.07.2010
Сообщений: 52
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Гоняя один и тот же файл, все данные будут извлекаться из кеша диска.
-ну, очевидно же, что все кандидаты\методы получения размера на чемпионский пояс тестируются в цикле\находятся в равных условиях, а разница в скорости будет только из за разницы реализации API в недрах Винды, в данный конкретный момент времени\места...


Цитата:
Сообщение от Stilet Посмотреть сообщение
Ради холливара??? Пф...
Чем только черти не шутят, когда людям заняться нечем...
-сам выдумал - сам себя и оспорил\подзадорил, уже в третий раз\пост.


Цитата:
Сообщение от xexxex Посмотреть сообщение
Привет!
Цель переплюнуть этот пример по скорости.
Предлагайте свои варианты.
-"Что-то пошло не так"©

Последний раз редактировалось xexxex; 10.04.2015 в 18:08.
xexxex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
android самый быстрый способ запустить приложение Deight Мобильные ОС (Android, iOS, Windows Phone) 2 13.10.2013 12:53
Самый быстрый способ задать цвет пикселю Terrance! Общие вопросы Delphi 13 05.12.2011 12:40
Ищу самый быстрый способ работы с файлами trunc Общие вопросы Delphi 6 15.10.2011 12:21
Самый быстрый способ получить изображение в заданном прямоугольнике? TwiX Мультимедиа в Delphi 4 04.04.2010 10:08
Самый быстрый способ проверить прокси? TwiX Работа с сетью в Delphi 6 15.02.2010 22:41