Использование вероятности для минимизации условных оценок для ускорения - PullRequest
0 голосов
/ 17 января 2020

Рассмотрим сценарий, когда у вас есть целые числа в диапазоне [1, BIG_NUMBER]; Если число делится на 3, выведите foo; Если число делится на 5, выведите bar; Делится как на 3, так и на 5, выведите foobar;

Один из способов сделать это -

// READABILITY IS GOOD
const func1 = length => {
    for (let i = 0; i <= length; i++) {
        let output = i;
        if (i % 3 === 0) output = 'foo';
        if (i % 5 === 0) output = 'bar';
        if (i % 3 === 0 && i % 5 === 0) output = 'foobar';
        console.log(output);
    }
};

Теперь, если мы подумаем о вероятности, вероятность делится на 3: p (3) = 1/3,

аналогично делится на 5: p (5) = 1/5

и делится на оба значения p (3 && 5) = 1/15

делится на одно из двух: p (3 || 5) = p (3) + p (5) - p (3 && 5)

Теперь вместо вышеперечисленного я пишу Вложенные операторы if:

const func3 = length => {
    for (let i = 0; i <= length; i++) {
        if (i % 3 === 0) {
            if (i % 5 === 0) {
                console.log('foobar');
            } else {
                console.log('foo');
            }
        } else if (i % 5 === 0) {
            console.log('bar');
        } else {
            console.log(i);
        }
    }
};

Подход состоит в том, чтобы поставить наиболее вероятный, если оператор первым, и наименее вероятный, если оператор последний, что должно минимизировать условные оценки.

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

1 Ответ

0 голосов
/ 18 января 2020

Не выполняйте ни одно из этих действий: вам нужно проверить оба состояния в той или иной форме. Вместо этого используйте прогрессивную компоновку вывода:

noise == ""
if (i % 3 === 0) noise += "foo"
if (i % 5 === 0) noise += "bar"
if (noise == "") noise = i
console.log(noise)

Простой, читаемый и достаточно быстрый.

...