NIKZZZZ
Gold Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Maza Faka Цитата: Посмотри здесь, очень интересный пример использования WinAPI функции | Спасибо за подсказку. Убедился, что строковые функции очень медленно работают. Для bin данных лучше создать структуру с помощью DllStructCreate(), обращение к ней на более , чем на два порядка превышает по скорости , чем работа со строками. модифицированный пример сравнения двух bin файлов: Код: #include <WinAPI.au3> $sFile1 = 'file.bin' $sFile2 = 'file2.bin' $sFile3 = 'Result.txt' $nFileSize1=FileGetSize($sFile1) $nFileSize2=FileGetSize($sFile2) Global $tBuffer1[$nFileSize1] Global $tBuffer2[$nFileSize2] $bBuffer1 = DllStructCreate("byte[" & $nFileSize1 & "]") $hFile = _WinAPI_CreateFile($sFile1, 2, 2) _WinAPI_ReadFile($hFile, DllStructGetPtr($bBuffer1),$nFileSize1,$nFileSize1) _WinAPI_CloseHandle($hFile) $bBuffer2 = DllStructCreate("byte[" & $nFileSize2 & "]") $hFile = _WinAPI_CreateFile($sFile2, 2, 2) _WinAPI_ReadFile($hFile, DllStructGetPtr($bBuffer2),$nFileSize2,$nFileSize2) _WinAPI_CloseHandle($hFile) $iAd = -1 $iCount = 0 $sf3 = '' For $iAddr = 1 To $nFileSize2 If (DllStructGetData($bBuffer1,1,$iAddr) <> DllStructGetData($bBuffer2,1,$iAddr)) Or ($iAddr>$nFileSize1) Then If $iAd <> $iAddr Then $sf3 &= @CRLF & Hex($iAddr -1, 8) & ':' $iCount = 0 $iAd = $iAddr EndIf $sf3 &= Hex(DllStructGetData($bBuffer2,1,$iAddr),2) $iAd += 1 $iCount += 1 If $iCount = 64 Then $iAd = -1 EndIf EndIf Next $f = FileOpen($sFile3, 2) FileWrite($f,$sf3) FileClose($f) | Файл ~ 1 Mb Время работы ранее приведенного скрипта - 240 секунд Этого - < 5 секунд. Жаль, что работа со структурами поддержана несколько неудобно. | Всего записей: 5365 | Зарегистр. 08-02-2006 | Отправлено: 17:14 07-11-2008 | Исправлено: NIKZZZZ, 17:17 07-11-2008 |
|