Оптимизация блока кода C ++, содержащего для и если - PullRequest
1 голос
/ 13 апреля 2020

Я работаю над проблемой, и вот фрагмент кода, который работает значительно хуже, чем теоретическое ожидание:

inline bool check(const int index, const float* f) const{
    for(int j=0; j<d; j++)
        if(points[index][j] != f[j])
            return false;
    return true;        
}

bool func(int p_cap, const float* f) const{
    int i = (p_cap - error > 0? p_cap - error: 0);
    int l = (p_cap + error + 1 < keyCount? p_cap + error + 1: keyCount);
    for(; i<l; i++)
        if(check(i, f))
            return true;
    return false;
}

Эти функции находятся внутри класса, и points и keyCount быть членами класса. points является keyCount*d 2-мерным массивом. d является глобальной переменной. Любая помощь о том, как я могу оптимизировать этот блок кода? Спасибо ...

РЕДАКТИРОВАТЬ:

Я использую интерполяцию для поиска в массиве, и мои данные таковы, что это возможно. Ожидается, что с помощью этой техники поиск любой точки будет быстрее, чем линейный поиск. Причина, по которой я ожидаю этого, заключается в том, что error = 1. Это означает, что для любой точки я смотрю максимум 3 различных точек в массиве points. У меня есть миллион таких массивов. Каждый хранит ровно 10 баллов. Ожидаемое значение для линейного поиска будет N/2, что означает, что мне нужно просмотреть 5, прежде чем я достигну точки запроса (опять же, ожидаемое / среднее значение). Таким образом, этот «код интерполяции» должен выполняться быстрее, чем линейный поиск, но этого не происходит.

Используемая команда компиляции:

g++ -O3 -march=native -DNDEBUG test.cpp -o test

1 Ответ

2 голосов
/ 13 апреля 2020

Я не уверен, что компилятор уже делает это, но вы можете сделать 2 вещи:

  • L oop через массивы с 1 для l oop (так как C ++ хранит их последовательно в памяти), это устраняет необходимость в нескольких вычислениях индекса и указателя, хотя только если вы хотите l oop через все записи и если все записи можно проверять.
  • Превратите его в одну проверку if, в вашем примере вы используете 1 в функции check (), а возвращаемое значение снова проверяется в функции fun c ().

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

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