Что нового

Тест Read/Write File WinApi

IMStrelcov

CTPEJIbLLOB
Сообщения
258
Репутация
66
Написал тестовый скрипт для проверки скорости чтения/записи файлов функциями WinApi и встроенными в AutoIt.
За код прошу не ругайть не придираться, это всего лишь для временного использования.
Если это имеет смысл тест проводил на системе: Windows 7 (x64), AutoIt: 3.3.14.5 (x32).
Мой тест показал что, WinApi Read быстрее AutoIt Read, но WinApi Write медленее чем AutoIt Write.
Такой вот результат:
тип чтения/записи
размер считываемого/записываемого блока
кол-во циклов/циклы
среднее время чтение/запись за цикл
общее затраченное время на чтение+запись за все циклы
Код:
Read/Write             1/100 Mb.     3/***     2.2/0.2 sec.     (6.6/0.6)
Api/Read/Write         1/100 Mb.     3/***     0.5/0.4 sec.     (1.6/1.1)
Bin/Read/Write         1/100 Mb.     3/***     0.5/0.1 sec.     (1.5/0.3)
Api/Bin/Read/Write     1/100 Mb.     3/***     0.3/0.4 sec.     (0.9/1.1)
Кто может протестировать у себя и отписаться какой результат.
А еще лучше может кто знает как ускорить WinApi Write, подскажет в чем проблема вносящая такую не разбериху и можно ли это как-то исправить?
 

Вложения

  • TestReadWriteFile.au3
    14.2 КБ · Просмотры: 8

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
указаны средние результаты. одни раз было, что winapi выдал на секунду меньше. в остальные разы разница как в коде
а куда быстрее?
системным копированием выходит примерно 21 секунда

Код:
#include <winapi.au3>
Local $fo = FileOpen('video.mp4', 16); 763Mb
Local $fo1 = FileOpen('video_1.mp4', 16 + 2)
Local $sr = 1048576 * 10
Local $fr
Local $t = TimerInit()
While 1
    $fr = FileRead($fo, $sr)
    If @error = -1 Then ExitLoop
    FileWrite($fo1, $fr)
WEnd
ConsoleWrite(TimerDiff($t) & @LF); 32 sec
FileClose($fo)
FileClose($fo1)
FileDelete('video_1.mp4')


Local $file_source = _WinAPI_CreateFile('video.mp4', 2, 2)
Local $file_dest = _WinAPI_CreateFile('video_1.mp4', 3, 4)
Local $iRead, $iWritten, $bytesRead = 0, $iToRead = 1048576 * 10, $tBuffer = DllStructCreate('byte[' & $iToRead & ']'), $iSize = _WinAPI_GetFileSizeEx($file_source)
$t = TimerInit()
While $bytesRead < $iSize
    _WinAPI_ReadFile($file_source, DllStructGetPtr($tBuffer), $iToRead, $iRead)
    _WinAPI_WriteFile($file_dest, DllStructGetPtr($tBuffer), $iRead, $iWritten)
    $bytesRead += $iToRead
WEnd
ConsoleWrite(TimerDiff($t) & @LF);20 sec
_WinAPI_CloseHandle($file_source)
_WinAPI_CloseHandle($file_dest)
FileDelete('video_1.mp4')
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
системным копированием выходит примерно 21 секунда
Попробуйте следующее:
1. Поменяйте в скрипте последовательность копирования - сначала WinAPI, затем AutoIt.
2. Скопируйте проводником любой другой файл (не video.mp4) примерно такого же размера.
3. Запустите скрипт 3 раза подряд.
Первое копирование всегда будет дольше последующих, т.к. данные кешируются.
Вы даже можете попробовать скопировать большой файл проводником в разные папки. Первое копирование будет раза в два дольше, чем последующие.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
В тесте использовались два разных файла для каждой функции по 146мб.

Если делать чтение-запись обеими методами один за другим в цикле, то результат такой
1 нативная функция первая

-------------------------------------------Копирование 1---------------------------------
1302.44856539029 - чтение натив -------- 270.251945428818 - запись натив
1417.41911332306 - чтение Api -------- 405.743607078553 - запись Api
-------------------------------------------Копирование 2---------------------------------
2713.07945562914 - чтение натив -------- 676.28693032215 - запись натив
2827.30395902272 - чтение Api -------- 812.17948091168 - запись Api
-------------------------------------------Копирование 3---------------------------------
4120.16785652925 - чтение натив -------- 1080.76089279503 - запись натив
4258.14747405047 - чтение Api -------- 1215.09290985307 - запись Api

2 Api первая
-------------------------------------------Копирование 1---------------------------------
117.596370488428 - чтение Api -------- 137.398817447469 - запись Api
1443.06524991305 - чтение натив -------- 421.732231331077 - запись натив
-------------------------------------------Копирование 2---------------------------------
1558.69188681802 - чтение Api -------- 590.101186044595 - запись Api
2868.40485313078 - чтение натив -------- 861.275176034943 - запись натив
-------------------------------------------Копирование 3---------------------------------
2985.70446802597 - чтение Api -------- 997.199504406286 - запись Api
4296.62352338076 - чтение натив -------- 1268.14567214548 - запись натив

Если каждый метод использовать в своем цикле, то результат такой

-------------------------------------------Копирование Api 1---------------------------------
113.940947802025 - чтение Api -------- 134.525617082618 - запись Api
-------------------------------------------Копирование Api 2---------------------------------
230.937940436564 - чтение Api -------- 269.835900931543 - запись Api
-------------------------------------------Копирование Api 3---------------------------------
371.322891596558 - чтение Api -------- 404.190895770273 - запись Api
-------------------------------------------Копирование нативная 1---------------------------------
1716.74479577712 - чтение натив -------- 680.616530871941 - запись натив
-------------------------------------------Копирование нативная 2---------------------------------
3068.24798961879 - чтение натив -------- 1318.69874523159 - запись натив
-------------------------------------------Копирование нативная 3---------------------------------
4411.18193792787 - чтение натив -------- 1591.65473544822 - запись натив


Видим, что с каждым шагом цикла время растет. Но Api работает быстрее, когда работает только она))
 
Верх