Что самый быстрый путь состоит в том, чтобы сравнить два массива байтов?

Предоставленные вами изображения предназначены для списков контроля доступа к сети (NACL), а не для групп безопасности. В общем, вы никогда не должны изменять конфигурацию NACL , если вы действительно не разбираетесь в сетях.

Скорее, вам следует настроить группу безопасности таким образом, чтобы разрешить входящий доступ только с вашего IP-адреса на желаемых портах.

6
задан Peter Mortensen 29 June 2015 в 19:16
поделиться

4 ответа

Что _Bytes(I) назвать выполнение? Это не загружает файл каждый раз, не так ли? Даже с буферизацией, которая была бы плохими новостями!

Будет много способов микрооптимизировать это с точки зрения рассмотрения longs за один раз, потенциально с помощью небезопасного кода и т.д. - но я просто сконцентрировался бы на получении разумной производительности сначала. Очевидно существует что-то очень нечетное продолжение.

Я предлагаю, чтобы Вы извлекли код сравнения в отдельную функцию, которая берет два массива байтов. Тем путем Вы знаете, что не будете делать ничего нечетного. Я также использовал бы простое For цикл, а не For Each в этом случае - это будет более просто. О, и проверьте, корректны ли длины сначала :)

Править: Вот код (непротестированный, но достаточно простой), что я использовал бы. Это находится в C# в течение минуты - я преобразую его через секунду:

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;
}

Править: И вот 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
16
ответ дан 8 December 2019 в 05:58
поделиться

Если Вы не должны знать байт, используйте 64-разрядный ints, который дает Вам 8 сразу. На самом деле можно выяснить неправильный байт, после того как Вы изолировали его к ряду 8.

Использование BinaryReader:

saveTime  = binReader.ReadInt32()

Или для массивов ints:

Dim count As Integer = binReader.Read(testArray, 0, 3)
3
ответ дан 8 December 2019 в 05:58
поделиться

Я вижу две вещи, которые могли бы помочь:

Во-первых, вместо того, чтобы всегда получить доступ к второму массиву как к объекту. Байты, используйте локальную переменную для указания непосредственно на массив. Таким образом, прежде, чем запустить цикл, сделайте что-то вроде этого:

 array2 = item.Bytes

Это сохранит издержки разыменования от объекта каждый раз, когда Вы хотите байт. Это могло быть дорого в Visual Basic, особенно если существует Метод получателя для того свойства.

Кроме того, используйте "определенный цикл" вместо "для каждого". Вы уже знаете длину массивов, поэтому просто кодируете цикл с помощью того значения. Это избежит издержек обработки массива как набор. Цикл выглядел бы примерно так:

For i = 1 to max Step 1
   If (array1(i) <> array2(i)) 
       Exit For
   EndIf 
Next
0
ответ дан 8 December 2019 в 05:58
поделиться

Не строго связанный с алгоритмом сравнения:

Вы уверены, что Ваше узкое место не связано с доступной памятью, и время раньше загружало массивы байтов? Загрузка двух массивов байтов на 2 ГБ только для сравнения их могла принести большинство машин к их коленям. Если проектирование программы позволяет, попытайтесь использовать потоки для чтения меньших блоков вместо этого.

0
ответ дан 8 December 2019 в 05:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: