J'ai cette boucle écrite en C++, qui compilé avec MSVC2010 prend beaucoup de temps à s'exécuter. (300ms)performance bizarre en C++ (VC 2010)
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
float val = 0;
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
val += original[k*w + m] * ds[k - i + hr][m - j + hr];
}
}
heat_map[i*w + j] = val;
}
}
}
Il me semblait un peu étrange pour moi, donc je fait quelques tests, changé quelques bits à l'assembleur en ligne: (plus précisément, le code qui résume "val")
for (int i=0; i<h; i++) {
for (int j=0; j<w; j++) {
if (buf[i*w+j] > 0) {
const int sy = max(0, i - hr);
const int ey = min(h, i + hr + 1);
const int sx = max(0, j - hr);
const int ex = min(w, j + hr + 1);
__asm {
fldz
}
for (int k=sy; k < ey; k++) {
for (int m=sx; m < ex; m++) {
float val = original[k*w + m] * ds[k - i + hr][m - j + hr];
__asm {
fld val
fadd
}
}
}
float val1;
__asm {
fstp val1
}
heat_map[i*w + j] = val1;
}
}
}
Maintenant, il fonctionne dans la moitié du temps, 150ms. Il fait exactement la même chose, mais pourquoi est-il deux fois plus rapide? Dans les deux cas, il a été exécuté en mode Release avec des optimisations activées. Est-ce que je fais quelque chose de mal dans mon code C++ original?
Avez-vous essayé de comparer le code d'assemblage généré dans les deux cas ... –