Рубрики

Методы оптимизации | Набор 1 (модуль)

Оператор модуля является дорогостоящим.

Оператор модуля (%) на разных языках является дорогостоящей операцией. В конечном счете, каждый оператор / операция должны приводить к инструкциям процессора. Некоторые процессоры не будут иметь инструкции модуля на аппаратном уровне, в этом случае компиляторы будут вставлять заглушки (предопределенные функции) для выполнения модуля. Это влияет на производительность.

Существует простая техника для извлечения остатка, когда число делится на другое число (делитель), который является степенью 2? Число, которое является точной степенью 2, будет иметь только один бит в своем двоичном представлении. Рассмотрим следующие степени 2 и их двоичные представления

2 — 1 0

4 — 100

8 — 1 000

16 — 1 0000

Обратите внимание на те нули в красном цвете, они вносят вклад в остаток при делении. Мы можем получить маску для этих нулей, уменьшив делитель на 1.

Обобщая вышеприведенный шаблон, число, которое может быть записано в форме 2 n, будет иметь только один установленный бит, за которым следуют n нулей с правой стороны от 1. Когда число (N) делится на (2 n ), позиции битов, соответствующие вышеупомянутые нули внесут вклад в остаток операции деления. Пример может прояснить,

N = 87 (1010111 — двоичная форма)


N% 2 = N & (2-1) = 1010111 & 1 = 1 = 1

N% 4 = N & (4-1) = 1010111 & 11 = 11 = 3

N% 8 = N & (8-1) = 1010111 & 111 = 111 = 7


N% 16 = N & (16-1) = 1010111 & 1111 = 111 = 7

N% 32 = N & (32-1) = 1010111 & 11111 = 10111 = 23

Работа модуля с точными степенями 2 проста и быстрее побитового ANDing. По этой причине программисты обычно устанавливают длину буфера в виде степеней 2.

Обратите внимание, что метод будет работать только для делителей, которые имеют степень 2.

Рекомендуемые посты:

Методы оптимизации | Набор 1 (модуль)

0.00 (0%) 0 votes