Skip to content

Instantly share code, notes, and snippets.

@wanderer20
Last active March 12, 2024 04:43
Show Gist options
  • Save wanderer20/83434e9cb8d6e6b4b0bf61f169a00992 to your computer and use it in GitHub Desktop.
Save wanderer20/83434e9cb8d6e6b4b0bf61f169a00992 to your computer and use it in GitHub Desktop.
[optim:01] Проверка на нечетность (isOdd) + bench
/**
Есть несколько вариантов проверить число на нечетность
1) const isOdd = (i: number): boolean => (i & 1) == 1
2) const isOdd = (i: number): boolean => !!(i & 1)
3) const isOdd = (i: number): boolean => i % 2 !== 0
4) const isOdd = (i: number): boolean => [false, true][i & 1]
*/
// Проверка будет простой, ориентироваться будем на одном вызове функции и на нескольких в цикле:
const start = performance.now();
isOdd(1);
/*
for (let i = 0; i < 100000000; i++) {
isOdd(i);
}
*/
const end = performance.now();
// Переводим в секунды
const diffSec = (end - start) / 1000;
// Выводим кол-во выполнений в секунду.
console.log('op/sec: ' + (1 / diffSec));
/**
На одном вызове isOdd:
1) op/sec: 36 900, 32 051, 32 894. Ср.А: 33 948 - 3 место
2) op/sec: 38 167, 36 363, 37 878. Ср.А: 37 469 - 1 место
3) op/sec: 36 231, 33 670, 34 602. Ср.А: 34 834 - 2 место
4) op/sec: 33 898, 34 843, 35 460. Ср.А: 34 733
На нескольких вызовах isOdd:
1) op/sec: 0.27102, 0.27225, 0.27350. Ср.А: 0.27225 - 3 место
2) op/sec: 0.27525, 0.27912, 0.27986. Ср.А: 0.27595 - 1 место
3) op/sec: 0.27454, 0.27406, 0.27901. Ср.А: 0.27587 - 2 место
4) op/sec: 0.27207, 0.27012, 0.27324. Ср.А: 0.27181
*/
/*
Итог: лучшим вариантом оказалась реализация с приведением к логическому значению последнего разряда числа через битовое И
(bitwise and).
Пояснение к методу:
В скобках используется битовая операция с маской, т.е. в приведенном 32-битном числе убирается всё, кроме младшего бита
(крайний справа).
Т.е. если в двоичном виде неважно что было на месте "x" (0 или 1) после примерения маски 0000 0001 к числу xxxx xxxy через
логическое "и" гарантированно останется только младший (крайний справа) бит в своём исходном виде, остальное обнулится. Останется
только 0000 000y.
i = xxxx xxx1 xxxx xxx0
&&&& &&&& &&&& &&&&
1 = 0000 0001 0000 0001
---- ---- ---- ----
0000 0001 = 1 0000 0000 = 0
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment