в программе, над которой я работаю, у меня есть трехэлементные массивы, которые я использую в качестве математических векторов для всех намерений и целей.
В ходе написания моего кода у меня возник соблазн просто свернуть свой собственный класс 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 взаимно тяготеющих тел. Эти векторные операции чрезвычайно распространены, поэтому важно, чтобы они выполнялись быстро.
Любое понимание будет оценено, как и любые идиомы или уловки, о которых я не знаю.