Po prostu natknąłem się na zmianę, która wydaje się mieć sprzeczne z intuicją konsekwencje wydajności. Czy ktoś może podać wyjaśnienie tego zachowania?Dziwna różnica wydajności C++?
oryginalny kod:
for (int i = 0; i < ct; ++i) {
// do some stuff...
int iFreq = getFreq(i);
double dFreq = iFreq;
if (iFreq != 0) {
// do some stuff with iFreq...
// do some calculations with dFreq...
}
}
Podczas czyszczenia ten kod podczas „przejściu performance”, postanowiłem przenieść definicję dFreq
wewnątrz bloku if
, ponieważ był używany tylko wewnątrz if
. Istnieje kilka obliczeń związanych z dFreq
, więc nie wyeliminowałem go całkowicie, ponieważ pozwala to zaoszczędzić na kosztach wielu konwersji w czasie rzeczywistym z int
do double
. Nie spodziewałem się żadnej różnicy w wydajności, lub jeśli w ogóle jakiejkolwiek, nieznacznej poprawy. Jednak wydajność spadła o prawie 10%. Zmierzyłem to wiele razy i jest to rzeczywiście zmiana, którą wprowadziłem. Pokazany powyżej fragment kodu wykonuje się wewnątrz kilku innych pętli. Dostaję bardzo spójne przebiegi między przebiegami i mogę zdecydowanie potwierdzić, że zmiana, którą opisuję, zmniejsza wydajność o ~ 10%. Oczekuję, że wydajność wzrośnie, ponieważ konwersja int
do double
nastąpi tylko wtedy, gdy iFreq != 0
.
kod Chnaged:
for (int i = 0; i < ct; ++i) {
// do some stuff...
int iFreq = getFreq(i);
if (iFreq != 0) {
// do some stuff with iFreq...
double dFreq = iFreq;
// do some stuff with dFreq...
}
}
Może ktoś to wyjaśnić? Używam VC++ 9.0 z/O2. Chcę tylko zrozumieć, o czym tutaj nie mówię.
Otrzymasz 10% zwrotu, gdy ją cofniesz? – GManNickG
Na podstawie podanych informacji nie można na nie odpowiedzieć, imo. –
Można porównać wygenerowany kod zespołu. ASM może pokazywać więcej różnic niż kod wysokiego poziomu. – Codism