Last active
March 12, 2024 04:43
-
-
Save wanderer20/83434e9cb8d6e6b4b0bf61f169a00992 to your computer and use it in GitHub Desktop.
[optim:01] Проверка на нечетность (isOdd) + bench
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
Есть несколько вариантов проверить число на нечетность | |
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