robię szybki test wydajności na bloku kodustd :: vector reserve() i push_back() jest szybszy niż resize() i indeks tablicy, dlaczego?
void ConvertToFloat(const std::vector<short>& audioBlock,
std::vector<float>& out)
{
const float rcpShortMax = 1.0f/(float)SHRT_MAX;
out.resize(audioBlock.size());
for(size_t i = 0; i < audioBlock.size(); i++)
{
out[i] = (float)audioBlock[i] * rcpShortMax;
}
}
byłem zadowolony z prędkością ponad pierwotnego bardzo naiwnej realizacji to trwa niewiele ponad 1 ms przetworzyć 65536 próbki audio.
Jednak tylko dla zabawy próbowałem następujące
void ConvertToFloat(const std::vector<short>& audioBlock,
std::vector<float>& out)
{
const float rcpShortMax = 1.0f/(float)SHRT_MAX;
out.reserve(audioBlock.size());
for(size_t i = 0; i < audioBlock.size(); i++)
{
out.push_back((float)audioBlock[i] * rcpShortMax);
}
}
Teraz pełni oczekiwana to aby nadać dokładnie taką samą wydajność jak oryginalny kod. Jednak nagle pętla pobiera teraz 900usec (tj. Jest o 100 sekund szybszy niż inne wdrożenie).
Czy ktoś może wyjaśnić, dlaczego dałoby to lepszą wydajność? Czy resize()
inicjuje nowo przydzielony wektor, w którym rezerwa po prostu alokuje, ale nie tworzy? To jedyna rzecz, o której mogę myśleć.
PS zostało to przetestowane na jednordzeniowym 2Ghz AMD Turion 64 ML-37.
Rutynowe sprawdzanie, czy podczas kompilacji kodu używasz ustawień zwolnienia zamiast debugowania? – Laserallan
hehehe, tak, używałem wersji Release. Było to raczej pytanie o pomoc dla kompilatora, aby mi pomóc :) – Goz