Potrzebuję zmniejszyć ilość pamięci używanej przez moją natywną aplikację Windows C++, bez uszczerbku dla jej wydajności.Dlaczego to pogorszenie wydajności?
Moim głównym struktura danych składa się z kilku tysięcy przypadków, dynamicznie przydzielane, z następującym Line
klasy:
struct Properties
{
// sizeof(Properties) == 28
};
// Version 1
class Line
{
virtual void parse(xml_node* node, const Data& data)
{
parse_internal(node, data);
create();
}
virtual void parse_internal(xml_node*, const Data&);
void create();
Properties p;
};
Ale ponieważ widzę, że mogłem pozbyć się członka klasy p
, bo tylko trzeba go wewnątrz metody parse, zmieniłem realizację Line
:
// Version 2
class Line
{
virtual void parse(xml_node* node, const Data& data)
{
Properties p;
parse_internal(node, data, &p);
create(&p);
}
virtual void parse_internal(xml_node*, const Data&, Properties*);
void create(Properties*);
};
ta zmniejszona pamięć przydzieloną kilku megabajtów, ale zwiększyły czas, który upłynął od ponad 50 milisekund.
Zastanawiam się, jak to jest możliwe, biorąc pod uwagę, że aplikacja została skompilowana do wersji release z pełną optymalizacją prędkości. Czy to z powodu argumentacji? Czy to ze względu na przydzielenie sterty mojego struct Properties
?
Aktualizacja:
Line::parse
Metoda nazywa się tylko raz dla każdej instancji. Struktura danych składa się z std::vector
z s. Line
. Wiele wątków zarządza innym podzbiorem tego wektora.
Czy próbowałeś uczynić go 'unique_ptr' w swojej metodzie' parse'? Czy twoja metoda "parse" jest wywoływana wiele razy dla tej samej "linii"? – krzaq
to Twoja aplikacja wielowątkowa? Jeśli nie, możesz użyć statycznego członka klasy w takim przypadku. –
@krzaq Czy masz na myśli, że make Properties a unique_ptr? Jeśli tak, dlaczego? Parse jest wywoływane tylko raz, ale nazywa się też metody klasy bazowej. – Nick