dans le programme sur lequel je travaille J'ai des tableaux à 3 éléments, que j'utilise comme vecteurs mathématiques à toutes fins pratiques.Efficacité des boucles écrites manuellement par rapport aux surcharges d'opérateur
Tout au long de l'écriture de mon code, je suis tenté de simplement rouler ma propre Vector
classe avec des surcharges arithmétiques simples (+, -, * /
) donc je peux simplifier les déclarations comme:
// old:
for (int i = 0; i < 3; i++)
r[i] = r1[i] - r2[i];
// new:
r = r1 - r2;
qui devrait être plus ou moins identiques dans le code généré. Mais quand il s'agit de choses plus compliquées, est-ce que cela pourrait vraiment affecter ma performance? Un exemple que j'ai dans mon code est le suivant:
Version manuelle écrite:
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;
}
Utilisation de la Vector
classe avec surcharge opérateur:
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;
Je cherche à optimiser mon code pour la vitesse , puisque ce genre de code s'exécute à l'intérieur des boucles internes. Est-ce que l'utilisation des opérateurs surchargés pour ces choses affectera les performances? Je fais une intégration numérique d'un système de n corps mutuellement gravitaires. Ces opérations vectorielles sont extrêmement courantes, il est donc important d'avoir une exécution rapide.
Toute idée serait appréciée, comme le feraient tous les idiomes ou astuces que je ne connais pas.
Vous pouvez regarder dans les modèles d'expression. Mais gardez à l'esprit pour obtenir des réponses précises dont vous aurez besoin pour profiler toutes les solutions que vous essayez. – GManNickG
En outre, certains compilateurs non seulement pour vous, ils déroulent aussi des boucles courtes qui ont un nombre défini d'exécutions (comme 3). Vous pourriez regarder le démontage et voir si c'est vrai, ou vous pourriez faire ce que d'autres ont suggéré, et faire un benchmarking pour voir si les opérateurs de surcharge est beaucoup plus rapide. –
Xavier, j'ai compilé l'opérateur surchargé et la version écrite manuellement avec les fichiers .asm d'assemblage + source. La plupart des boucles étaient extrêmement similaires. Certains, comme celui que j'ai posté ci-dessus, avaient de très longues chaînes d'assemblage pour l'opérateur basé sur une surcharge, et des chaînes beaucoup plus courtes avec mes boucles manuelles. Encore, comme je l'ai commenté ci-dessous, ma version Vector était encore plus rapide. –