2016-10-21 33 views
7

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.

+0

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

+0

to Twoja aplikacja wielowątkowa? Jeśli nie, możesz użyć statycznego członka klasy w takim przypadku. –

+0

@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

Odpowiedz

0

Piszesz, że parametr parse_internal jest rekursywny. Oznacza to, że otrzymuje 3 argumenty w zmienionym wariancie, zamiast 2 w oryginale - i jest wywoływany kilka razy.

Musisz także uzyskać dostęp do elementów składni, używając odwołań do wskaźników zamiast usuwania elementów (i ewentualnie sprawdź, czy wskaźnik Właściwości ma wartość inną niż null). Aby wyeliminować problemy z wskaźnikami, możesz użyć argumentu referencyjnego do parametru parse_internal.

Czy istnieje powód, aby mieć parse_internal jako funkcję wirtualnego członka, czy też można ją zmienić na statyczną (w zmodyfikowanym wariancie)?