What is the fastest way to compare two byte arrays?

后端 未结 6 1495
你的背包
你的背包 2021-01-18 07:59

I am trying to compare two long bytearrays in VB.NET and have run into a snag. Comparing two 50 megabyte files takes almost two minutes, so I\'m clearly doing something wron

6条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-18 08:30

    What is the _Bytes(I) call doing? It's not loading the file each time, is it? Even with buffering, that would be bad news!

    There will be plenty of ways to micro-optimise this in terms of looking at longs at a time, potentially using unsafe code etc - but I'd just concentrate on getting reasonable performance first. Clearly there's something very odd going on.

    I suggest you extract the comparison code into a separate function which takes two byte arrays. That way you know you won't be doing anything odd. I'd also use a simple For loop rather than For Each in this case - it'll be simpler. Oh, and check whether the lengths are correct first :)

    EDIT: Here's the code (untested, but simple enough) that I'd use. It's in C# for the minute - I'll convert it in a sec:

    public static bool Equals(byte[] first, byte[] second)
    {
        if (first == second)
        {
            return true;
        }
        if (first == null || second == null)
        {
            return false;
        }
        if (first.Length != second.Length)
        {
            return false;
        }
        for (int i=0; i < first.Length; i++)
        {
            if (first[i] != second[i])                
            {
                return false;
            }
        }
        return true;
    }
    

    EDIT: And here's the VB:

    Public Shared Function ArraysEqual(ByVal first As Byte(), _
                                       ByVal second As Byte()) As Boolean
        If (first Is second) Then
            Return True
        End If
    
        If (first Is Nothing OrElse second Is Nothing) Then
            Return False
        End If
        If  (first.Length <> second.Length) Then
             Return False
        End If
    
        For i as Integer = 0 To first.Length - 1
            If (first(i) <> second(i)) Then
                Return False
            End If
        Next i
        Return True
    End Function
    

提交回复
热议问题