Какой самый быстрый способ подсчитать все ненулевые байты байтового среза - PullRequest
0 голосов
/ 06 марта 2020

У меня есть срез байтов, подобный этому:

mbBytes := 1048576
x := make([]byte, 16 * mbBytes)

Мне известен метод bytes.Trim(s []byte, cutset string), который позволяет нам отрезать все начальные и конечные вхождения cutset, но кажется, что этот метод довольно медленно - для удаления всех нулей из такого среза требуется примерно 80 мс.

Я попробовал альтернативный подход ниже;

func nonZeroLength(b []byte) int {
    a := 0
    for _, v := range b {
        if v != 0 {
            a++
        }
    }
    return a
}

Этот метод в 8-10 раз быстрее, чем bytes.Trim().

Но когда срез заполнен множеством ненулевых значений - эти методы довольно медленные.

Есть ли более быстрый алгоритм или встроенные методы для удаления нулей из байтового среза?

1 Ответ

3 голосов
/ 06 марта 2020

Как указывалось другими, «его истинный размер» и «считать все ненулевые байты» - разные вещи, но я оставлю это как терминологию.

Быстрый способ подсчета всех ненулевых байтов используется bytes.Count для подсчета нулевых байтов и вычитания его из длины массива.

non_zero_count = len(x) - bytes.Count(x, []byte("\x00"))

Это примерно в 10 раз быстрее, чем ваша функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...