в программе, над которой я работаю, у меня есть 3-элементные массивы, которые я использую в качестве математических векторов для любых целей и задач.
В процессе написания моего кода у меня возникло желание просто свернуть свой собственный класс Vector
с простыми арифметическими перегрузками (+, -, * /
), чтобы я мог упростить такие выражения, как:
// old:
for (int i = 0; i < 3; i++)
r[i] = r1[i] - r2[i];
// new:
r = r1 - r2;
Что должно быть более или менее идентично в генерируемом коде. Но когда дело доходит до более сложных вещей, может ли это сильно повлиять на мою производительность? Один пример из моего кода:
Версия, написанная вручную:
for (int j = 0; j < 3; j++)
{
p.vel[j] = p.oldVel[j] + (p.oldAcc[j] + p.acc[j]) * dt2 + (p.oldJerk[j] - p.jerk[j]) * dt12;
p.pos[j] = p.oldPos[j] + (p.oldVel[j] + p.vel[j]) * dt2 + (p.oldAcc[j] - p.acc[j]) * dt12;
}
Использование класса Vector
с перегрузками операторов:
p.vel = p.oldVel + (p.oldAcc + p.acc) * dt2 + (p.oldJerk - p.jerk) * dt12;
p.pos = p.oldPos + (p.oldVel + p.vel) * dt2 + (p.oldAcc - p.acc) * dt12;
Я пытаюсь оптимизировать мой код для скорости, так как этот код выполняется внутри внутренних циклов. Повлияет ли использование перегруженных операторов на эти вещи на производительность? Я делаю некоторое численное интегрирование системы из n взаимно гравитирующих тел. Эти векторные операции чрезвычайно распространены, поэтому очень важно иметь быстрый запуск.
Буду признателен за любую проницательность, равно как и за любые идиомы или уловки, о которых я не знаю.