Мне любопытно, какой метод быстрее при доступе к векторам.Векторная скорость доступа, какой метод быстрее?
Для простоты, скажем, у меня есть два объекта: Player
и Ship
.
Существует вектор указателей игроков vector<Player*> players
, и каждый объект игрока содержит вектор указателей корабля vector<Ship*> ships
, а затем каждый корабль имеет несколько функций, которые он может вызвать, и так далее.
В этих ситуациях быстрее ли получить доступ к этим функциям? Или создать временный указатель объекта для доступа ко всему?
Это быстрее, чтобы сделать это:
for (int i = 0; i < players.size(); i++)
{
for (int j = 0; j < players.at(i)->ships.size(); j++)
{
players.at(i)->ships.at(j)->update();
if (
(players.at(i)->ships.at(j)->get_x() > 0) &&
(players.at(i)->ships.at(j)->get_x() < screen_x) &&
(players.at(i)->ships.at(j)->get_y() > 0) &&
(players.at(i)->ships.at(j)->get_y() < screen_y)
)
{
players.at(i)->visible.push_back(j);
}
}
}
Или быстрее создавать временные указатели, так что векторы не должны быть постоянно доступны:
for (int i = 0; i < players.size(); i++)
{
Player* play = players.at(i);
for (int j = 0; j < play->ships.size(); j++)
{
Ship* ship = play->ships.at(j);
ship->update();
int ship_x = ship->get_x();
int ship_y = ship->get_y();
if (
(ship_x > 0) &&
(ship_x < screen_x) &&
(ship_y > 0) &&
(ship_y < screen_y)
)
{
play->visible.push_back(j);
}
}
}
Я знаю, что второй визуально опережает, но на самом деле не знает, обязательно ли это быстрее.
Мысли?
Что произошло, когда вы профилировали оба? – geoffspear
Это зависит от того, может ли компилятор гарантировать, что ваш код не изменяет векторы. Например, что произойдет, если 'get_x' изменяет игроков или корабль? Затем в первой версии нужно снова искать векторы. Конечно, 'get_x', от его имени, вероятно, не изменяет векторы. Но компилятор не может этого знать, если в это время не отображается код функции (например, встроенная функция). –
. Чем быстрее работает 'operator []' вместо '.at()'. Или, используя современный C++: 'for (Ship & ship: ships) для (Player & play: players)' – MSalters