@krwq:
Niestety to twoje "szybsze" iterowanie jest ok. 10 razy wolniejsze od tego co użyłem w pierwszym poście :)
Swoją drogą, jest w ktoś stanie wyjaśnić następującą rzecz?
Pierwszy przykład:
class Position
{
UINT16 x;
UINT16 y;
BYTE z;
};
std::vector<Position> vector;
// Inicjacja vector'a
for(int i = 0; i < 10000000; i++)
{
vector.push_back(Position(0,0,0));
}
Czas wykonywania: 350 ms
for(int i = 0; i < vector.size(); i++)
{
Position pos = vector[i];
if(pos.x == 0 && pos.y == 0 && pos.z == 0)
pos.x = 1;
}
Czas wykonywania: 3600 ms
for(std::vector<Position>::iterator i = vector.begin(); i != vector.end(); i++)
{
Position pos = *i;
if(pos.x == 0 && pos.y == 0 && pos.z == 0)
pos.x = 0;
}
Wyżej został użyty std::vector<Position>, teraz użyję std::vector<Position*>
Drugi przykład:
class Position
{
UINT16 x;
UINT16 y;
BYTE z;
};
std::vector<Position*> vector;
// Inicjacja vector'a
for(int i = 0; i < 10000000; i++)
{
vector.push_back(new Position(0,0,0));
}
Czas wykonywania: 14000 ms (??!!)
for(int i = 0; i < vector.size(); i++)
{
Position* pos = vector[i];
if(pos->x == 0 && pos->y == 0 && pos->z == 0)
pos->x = 1;
}
Czas wykonywania: 17000 ms (??!!)
for(std::vector<Position*>::iterator i = vector.begin(); i != vector.end(); i++)
{
Position* pos = *i;
if(pos->x == 0 && pos->y == 0 && pos->z == 0)
pos->x = 0;
}
Jak widać w pierwszym przykładzie został użyty czysty obiekt Position (5 bajtowy)
W drugim został użyty wskaźnik na ten obiekt (4 bajtowy)
Na logikę drugi przykład powinien być znacznie szybszy, a jest niesamowicie mniej wydajny.
Mógłby ktoś to wyjaśnić?