Доступ к переменным объекта, замедляющего программу (C ++)

0

Я программирую симуляцию, которая проходит через вектор. Внутри кода он выполняет операцию, где вычисляет delta x и y из 2 объектов на каждой итерации. Код, над которым я работаю:

for(unsigned z = 0; z < creatures.size(); z++) {
    for(unsigned z2 = 0; z2 < creatures.size(); z2++) {
        if(z != z2) {
            int delta_x = creatures[z2].xpos - creatures[z].xpos;
            int delta_y = creatures[z2].ypos - creatures[z].ypos;
        }
    }
}

Heres класс:

class Creature {
    public:
        int xpos;
        int ypos;
        ...
};

Другой код идет туда, но не влияет на производительность. Я замечаю, что если я изменил назначение дельт на число или даже операцию вычитания (например, z-z2 или что-то подобное), он улучшает "FPS" программы от ~ 5 до ~ 7/8. Есть ли способ ускорить эту операцию?

  • 0
    Вы уверены, что этот код влияет на производительность? Это не кажется мне дорогостоящим.
  • 0
    Где определены creatures ?
Показать ещё 9 комментариев
Теги:
optimization
class
loops
vector

1 ответ

4
Лучший ответ

Следующее может быть быстрее

const std::size_t size = creatures.size();
for (unsigned z = 0; z + 1 < size; z++) {
    const int zx = creatures[z].xpos;
    const int zy = creatures[z].ypos;
    for (unsigned z2 = z + 1; z2 < size; z2++) {
            const int delta_x = creatures[z2].xpos - zx;
            const int delta_y = creatures[z2].ypos - zy;
    }
}
  • перемещать creatures[z].xpos за пределы цикла.
  • Переместите creatures.size() вне цикла.
  • Так как пара {z, z2} симметрична {z2, z}, то выполняются задания.

EDIT: creatures.size() перемещается за пределы цикла (благодаря shawn1874)

  • 0
    Вау, не могу поверить, что я не думал об этом. Спасибо вам большое! Мне удалось продвинуться на полпути, но я думаю, что смогу реализовать эту идею в другом месте, чтобы повысить производительность этой программы. Интересно, почему доступ к переменным класса занимает так много времени ...
  • 0
    Вы также пытались использовать итераторы или просто вызывать размер только один раз за пределами цикла? Если избыточный доступ к атрибуту вызывает проблемы с производительностью, то, безусловно, повторный вызов функции-члена не поможет. size_t theSize = creatures.size ()
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню