Определите минимум три числа с минимальным количеством сравнений - PullRequest
0 голосов
/ 24 апреля 2020

Итак, у меня есть небольшая проблема с оптимизацией. Мне нужно определить, какое из трех значений с плавающей точкой является минимальным, за минимальное количество операций / сравнений. Вот что у меня есть:

if (x < y) {
    if (x < z) {
        // Do X related code
    } else {
        // Do Z related code
    }
} else {
    if (y < z) {
        // Do Y related code
    } else {
        // Do Z related code. (Duplicate!!!!)
    }
}

Этот метод всегда требует ТОЛЬКО двух сравнений. Это прилично важно, потому что это выполняется в очень узком l oop и может происходить сотни или тысячи раз за кадр. Поэтому я также хотел бы избежать выделения большего количества переменных.

Как видите, у нас есть небольшой дубликат для кода, связанного с Z. Код короткий, как 3 строки, но мне все еще не хватает того, что я должен его дублировать.

Возможно ли сделать это только с двумя сравнениями, без дополнительных выделений, и не нужно дублировать Z-код?

Спасибо,

1 Ответ

0 голосов
/ 25 апреля 2020

Можно попытаться сначала ввести bool флаги, а затем выбрать ветку, проверив их значения. Например, G CC 9.1 (с -O1 и выше) создает одинаковый код сборки для

if (x < y) {
    if (x < z)
        fx();
    else
        fz();
} else {
    if (y < z)
        fy();
    else
        fz();
}

и

bool bx = false;
bool by = false;
if (x < y)
    bx = (x < z);
else
    by = (y < z);

if (by)
    fy();
else if (bx)
    fx();
else
    fz();

В зависимости от того, что фактический код, связанный с XYZ, заключается в том, что эта оптимизация может не применяться компилятором (и, возможно, по уважительной причине). Вы можете просмотреть сгенерированную сборку и тестировать обе версии.

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