Optimisation de calculs (win64)

Description

BUT: Optimiser les perfs.
Renommer bnTndc.ex_ en bnTndc.exe pour tester.

On part de cette fonction. C'est une SIMPLE traduction en C d'une fonction faite en VB sur Excel (comme tout le projet) par un pro de la statistique. Donc matheux mais pas du tout informaticien.
C'est une déclinaison de la fonction TENDANCE.

float c1Tendce(float *pA, float *pTbl, int deb, int fin)
{
float XRef, moy, CumY1, CumY2;
int i;
XRef = (float) ((fin + 1 - deb) / 2 + deb);
CumY1 = 0.0f;
CumY2 = 0.0f;
moy = 0.0f;
i = deb;
while(i <= fin) moy += pTbl[i++];
moy /= (float) (fin + 1 - deb);
for(; deb <= fin; deb++) {
CumY1 = CumY1 + (XRef - (float) deb) * (moy - pTbl[deb]);
CumY2 = CumY2 + (XRef - (float) deb) * (XRef - (float) deb);
}
CumY1 /= CumY2;
  • pA = CumY1;

return (moy - CumY1 * XRef);
}

Partant d'une série de valeurs (pTbl), le but est d'en calculer 2. Une est placée en pA et l'autre est retournée.
On la réécrit un plus proprement (vu du C) afin de l'étudier:
float c1Tendce(float *pA, float *pTbl, int deb, int fin)
{
float XRef, moy, CumY1, CumY2, f;
int i, n;
n = fin + 1 - deb;
XRef = (float) (n / 2 + deb);
CumY1 = 0.0f;
CumY2 = 0.0f;
moy = 0.0f;
i = deb;
while(i <= fin) moy += pTbl[i++];
moy /= (float) n;
for(; deb <= fin; deb++) {
f = XRef - (float) deb;
CumY1 += f * (moy - pTbl[deb]);
CumY2 += f * f;
}
CumY1 /= CumY2;
  • pA = CumY1;

return (moy - CumY1 * XRef);
}

Cela fait, on inspecte le projet pour voir les appels de cette fonction.
float A, B, C, D;
B = c1Tendce(&A, tbl, 12, 23);
D = c1Tendce(&C, tbl, 24, 35);
Les bornes sont toujours les mêmes, 12-23 ou 24-35.
Ah que voilà une info très intéressante.

Voyons le tableau, toujours 36 valeurs (pour 36 mois), dont on calcule les 2 dernières années.
Seconde info très intérssante...
Je vous invite à regarder dans le cede du zip joint comment je suis arrivé à:
float c2TendceDOUZE(float *pA, float *pTbl, float ftaux);
Puis en ASM:
float a1TendceDOUZE(float *pA, float *pTbl, float ftaux);
et enfin:
float a2TendceDOUZE(float *pA, float *pTbl, float ftaux);

Les résultats de chaque fonction sont affichés pour bien vérifier qu'ils sont justes.
PERFS donne QueryPerformanceCounter (fin - deb) sur une boucle de 500 tours pour chaque.

Je précise que tout ceci n'est pas gratuit, cette fonction est appelée au bas mot 1 million de fois chque nuit quand le calculateur est lancé, et il en comprend un grand nombre de fonctions de ce genre.
Je suis preneur de toute version plus rapide.

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.