Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить файлы / 20 сообщений из 20, страница 1 из 1
27.06.2006, 15:02
    #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
27.06.2006, 15:56
    #33817233
vbnet2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Используйте стандартные ХЭШ-функции.
Не знаете как - пишите свою, но сравнивать в лоб - кому ж такое придет в голову...
...
Рейтинг: 0 / 0
27.06.2006, 16:10
    #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
27.06.2006, 16:14
    #33817299
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
vbnet2000Используйте стандартные ХЭШ-функции.
Не знаете как - пишите свою, но сравнивать в лоб - кому ж такое придет в голову...
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? Да и вряд ли любые расчеты будут быстрее простого сравнения...
...
Рейтинг: 0 / 0
27.06.2006, 17:00
    #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
27.06.2006, 18:19
    #33817669
vbnet2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Код: plaintext
1.
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? 
Да и вряд ли любые расчеты будут быстрее простого сравнения...
А как вы думаете, почему SQL-Сервер и все остальные проги ничего не сравнивают напрямую, а ВСЕГДА сравнивают только Хеши - посмотрите любой план запроса...
И вообще на хрена они б были нужны вообще, если б они работали медленнее прямого сравнения?
...
Рейтинг: 0 / 0
28.06.2006, 10:05
    #33818441
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
У меня получились следующие результаты на MSVBVM50.dll
0,0301 - сравнение с подсчётом CRC32
0,0167 - сравнение от Aklin

Выгода использования контрольной суммы проявляется при числе сравнений > 2
...
Рейтинг: 0 / 0
28.06.2006, 10:17
    #33818485
arseny
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Дайте наводку на хеш плиз
...
Рейтинг: 0 / 0
28.06.2006, 11:10
    #33818647
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
CRC32
...
Рейтинг: 0 / 0
28.06.2006, 11:11
    #33818652
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
SHA256
...
Рейтинг: 0 / 0
29.06.2006, 11:25
    #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
29.06.2006, 12:55
    #33821480
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Вообще-то от VB-кода до асма далеко как до Луны. Большое количество операций идет через вызов функций msvbvm60.dll

XOR выполняется вызовом __vbavarxor, сравнение строк через __vbastrcomp, так что это еще бабка надвое сказала, какой вариант будет быстрее.
...
Рейтинг: 0 / 0
29.06.2006, 13:00
    #33821492
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Еще один важный момент - все операции с Variant происходят через вызовы функций, поэтому Variant крайне нежелательно использовать в часто исполняемом коде.
...
Рейтинг: 0 / 0
29.06.2006, 13:17
    #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
29.06.2006, 13:34
    #33821619
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
В общем используй StrComp, в качестве параметров можешь передавать непосредственно байтовые массивы. Два массива размером 60 мегов сравниваются меньше, чем за секунду.
...
Рейтинг: 0 / 0
03.07.2006, 14:11
    #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
03.07.2006, 16:07
    #33828022
marvan
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Тест на msvbvm50.dll
0,03 - сравнение с подсчётом CRC32
0,0163 - сравнение от Aklin
0,022 - сравнение текста от arseny (Compare2Files = Var1 = Var2)
...
Рейтинг: 0 / 0
06.07.2006, 15:25
    #33835925
Goldminer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
vbnet2000
Код: plaintext
1.
Как, интересно, хэш-функции избавят от необходимости ПРОЧИТАТЬ оба исходных файла? 
Да и вряд ли любые расчеты будут быстрее простого сравнения...
А как вы думаете, почему SQL-Сервер и все остальные проги ничего не сравнивают напрямую, а ВСЕГДА сравнивают только Хеши - посмотрите любой план запроса...
И вообще на хрена они б были нужны вообще, если б они работали медленнее прямого сравнения?Я думаю, СУБД сталкиваются с задачей МНОГОКРАТНОГО перекрестного сравнения больших наборов значений. Т.е. их приходится либо многократно прочитывать (что нереально), либо кэшировать, причем хэш пзволяет экономить память. К задаче ОДНОКРАТНОГО сравнения это, ИМХО, вообще отношения не имеет.
...
Рейтинг: 0 / 0
07.07.2006, 17:01
    #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
08.07.2006, 12:43
    #33840044
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнить файлы
Тем, что гланды принято удалять через горло, а не ж...
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Сравнить файлы / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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