powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить файлы
20 сообщений из 20, страница 1 из 1
Сравнить файлы
    #33817034
arseny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал вот такой механизм сравнивания двух файлов:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Private Function Compare2Files(szFile1 As String, szFile2 As String) As Boolean
    Dim Var1 As Byte
    Dim Var2 As Byte
    
    
    
    Compare2Files = True
    
    Open szFile1 For Binary As # 1 : Open szFile2 For Binary As # 2 
        If LOF( 1 ) = LOF( 2 ) Then
            Do While Loc( 1 ) <= LOF( 1 )
                Get # 1 , , Var1: Get # 2 , , Var2
                
                If Var1 <> Var2 Then
                    Compare2Files = False
                    Exit Do
                End If
            Loop
        Else
            Compare2Files = False
        End If
    Close # 1 : Close # 2 
End Function
На сравнивание 2 файлов размеров в 400 кб уходит 3 сек. Многова-то по моему...
Есть другие предложения? API?
...
Рейтинг: 0 / 0
Сравнить файлы
    #33817233
Фотография vbnet2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте стандартные ХЭШ-функции.
Не знаете как - пишите свою, но сравнивать в лоб - кому ж такое придет в голову...
...
Рейтинг: 0 / 0
Сравнить файлы
    #33817284
Goldminer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
arsenyСделал вот такой механизм сравнивания двух файлов:
Код: plaintext
1.
2.
3.
4.
Private Function Compare2Files(szFile1 As String, szFile2 As String) As Boolean
    Dim Var1 As Byte
    Dim Var2 As Byte
    
End Function
На сравнивание 2 файлов размеров в 400 кб уходит 3 сек. Многова-то по моему...
Есть другие предложения? API?
Еще бы, по одному байту читать! Напр. так:
Код: plaintext
1.
2.
Dim Var1 as String
Var1 = String( 65536 , " ")
...
...
Рейтинг: 0 / 0
Сравнить файлы
    #33817299
Goldminer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbnet2000Используйте стандартные ХЭШ-функции.
Не знаете как - пишите свою, но сравнивать в лоб - кому ж такое придет в голову...
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? Да и вряд ли любые расчеты будут быстрее простого сравнения...
...
Рейтинг: 0 / 0
Сравнить файлы
    #33817466
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несмотря на кажущуюся сложность, хеш работает очень быстро.
Однако не надо забывать, что по бинарка быстра тем, что читает почти сразу в память:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Function cmp2files(vFile1 As String, vFile2 As String) As Boolean
  Dim t1 As Long, t2 As Long
  Dim m1() As Byte, m2() As Byte
  
  cmp2files = False
  
  t1 = FreeFile
  Open vFile1 For Binary As #t1
    t2 = FreeFile
    Open vFile2 For Binary As #t2
      
      If LOF(t1) <> LOF(t2) Then Exit Function
      
      ReDim m1(LOF(t1))
      ReDim m2(LOF(t2))
    
      Get #t1, , m1()
      Get #t2, , m2()
    
    Close #t2
  Close #t1
  
  t2 = UBound(m1) -  1 
  For t1 =  0  To t2
    If m1(t1) <> m2(t1) Then Exit Function
  Next t1
  
  cmp2files = True
End Function

На 2000Mhz, 1Gb ок. 0.3 сек. на файл MSVBVM50.dll (1.3M)

А еще быстрее будет, если вместо byte использовать long. (double неуместен,т.к. там другой алгоритм сравнения)
Возможно также строки будут быстры.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33817669
Фотография vbnet2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? 
Да и вряд ли любые расчеты будут быстрее простого сравнения...
А как вы думаете, почему SQL-Сервер и все остальные проги ничего не сравнивают напрямую, а ВСЕГДА сравнивают только Хеши - посмотрите любой план запроса...
И вообще на хрена они б были нужны вообще, если б они работали медленнее прямого сравнения?
...
Рейтинг: 0 / 0
Сравнить файлы
    #33818441
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня получились следующие результаты на MSVBVM50.dll
0,0301 - сравнение с подсчётом CRC32
0,0167 - сравнение от Aklin

Выгода использования контрольной суммы проявляется при числе сравнений > 2
...
Рейтинг: 0 / 0
Сравнить файлы
    #33818485
arseny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дайте наводку на хеш плиз
...
Рейтинг: 0 / 0
Сравнить файлы
    #33818647
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CRC32
...
Рейтинг: 0 / 0
Сравнить файлы
    #33818652
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SHA256
...
Рейтинг: 0 / 0
Сравнить файлы
    #33821185
Фотография Aklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы асм знаете?
При подсчете используется прямая формула:
Код: plaintext
1.
2.
3.
m:
xor <оп1>, <оп2>
dec CX
loop m

При условиях:
Код: plaintext
1.
2.
3.
4.
5.
6.
m:
cmp <оп1>, <оп2>
jeq lab
ret
lab:
dec cx
loop m

2 комадны вместо 1!!! причем код загружается в кеш, а при передачи управления (jmp например) кеш приходится очищать -> время!!!
Также в процессоре конвеер (в P4 на 20 строк) очищается при передачи управления -> приходится заново его заполнять.

Так что CRC аппаратно быстрее раз эдак в 10...
...
Рейтинг: 0 / 0
Сравнить файлы
    #33821480
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще-то от VB-кода до асма далеко как до Луны. Большое количество операций идет через вызов функций msvbvm60.dll

XOR выполняется вызовом __vbavarxor, сравнение строк через __vbastrcomp, так что это еще бабка надвое сказала, какой вариант будет быстрее.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33821492
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще один важный момент - все операции с Variant происходят через вызовы функций, поэтому Variant крайне нежелательно использовать в часто исполняемом коде.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33821555
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Variant и String не совсем в тему, но уже очевидно, что сравнение двух Long'ов будет быстрее, чем XOR.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    Dim i As Long
    Dim crc As Long
    Dim z As Long
    Dim t As Long
    Dim r As Boolean
    t = Timer
    For z =  1  To  500 
        For i =  0  To UBound(ByteArray) -  1 
            crc = crc Xor ByteArray(i)
        Next i
    Next z
    Debug.Print Timer - t
    t = Timer
    For z =  1  To  500 
        For i =  0  To UBound(ByteArray) -  1 
            r = crc = ByteArray(i)
        Next i
    Next z
    Debug.Print Timer - t
Этот тест на файле около ста кило дал значения 4,90625 и 4,734375 соответственно. Алгоритм подсчета CRC на vb определенно сложнее, чем единичный XOR, так что разница будет гораздо больше.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33821619
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем используй StrComp, в качестве параметров можешь передавать непосредственно байтовые массивы. Два массива размером 60 мегов сравниваются меньше, чем за секунду.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33827556
arseny
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так не проще? Или что-то не так забабацал?
Сравнивает за милисекунды файлы по 400 кб.
Сделано по образцу из документации по 'Get':
Тестировано на 2 одинаковых файлах и на 2 разных файлах.
Надо мудрить или так оставить? :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
        Open szFile1 For Binary As # 1 : Open szFile2 For Binary As # 2 
            Var1 = String(LOF( 1 ), " "): Var2 = String(LOF( 2 ), " ")
            
            Get # 1 , , Var1: Get # 2 , , Var2
            
            Compare2Files = Var1 = Var2
        Close # 1 : Close # 2 
...
Рейтинг: 0 / 0
Сравнить файлы
    #33828022
marvan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тест на msvbvm50.dll
0,03 - сравнение с подсчётом CRC32
0,0163 - сравнение от Aklin
0,022 - сравнение текста от arseny (Compare2Files = Var1 = Var2)
...
Рейтинг: 0 / 0
Сравнить файлы
    #33835925
Goldminer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vbnet2000
Код: plaintext
1.
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? 
Да и вряд ли любые расчеты будут быстрее простого сравнения...
А как вы думаете, почему SQL-Сервер и все остальные проги ничего не сравнивают напрямую, а ВСЕГДА сравнивают только Хеши - посмотрите любой план запроса...
И вообще на хрена они б были нужны вообще, если б они работали медленнее прямого сравнения?Я думаю, СУБД сталкиваются с задачей МНОГОКРАТНОГО перекрестного сравнения больших наборов значений. Т.е. их приходится либо многократно прочитывать (что нереально), либо кэшировать, причем хэш пзволяет экономить память. К задаче ОДНОКРАТНОГО сравнения это, ИМХО, вообще отношения не имеет.
...
Рейтинг: 0 / 0
Сравнить файлы
    #33839162
ZeusTheTrueGod
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а чем команда fc не нравится?

Что-то вроде

Shell "fc.exe /b file1 file2 >compareresult.txt",,,,Wait
open "compareresult.txt" for input as #1
Line input #1,S
'анализ строки.если совпадают - должно вернуться только две строки с текстом
close #1
...
Рейтинг: 0 / 0
Сравнить файлы
    #33840044
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тем, что гланды принято удалять через горло, а не ж...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить файлы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]