Gelöst. Dramatischer Performanz-Verlust beim Sortieren!



  • Hallo,

    nach einem Refactoring braucht der Sortieralgorithmus auf einmal
    dreimal 😮 so lange wie vorher.

    Der Aufruf ist vorher gewesen:

    std::list< std::vector< double > > list = ...;
    list->sort( SortList() );
    

    Nach dem Refactoring gibt es eine eigene Container-Klasse:

    std::list< Container > list = ...;
    list->sort( SortList() );
    

    Liegt das an der Sortierklasse?

    Vorher:

    enum MatrixCol
    {
    	FROM = 0, 
    	TO = 1,
    	COUNT = 2,
    	RANGE = 3,
    	MEAN = 4,
    	COUNT_FULL = 5
    };
    
    class SortList
    {
    public:
    	bool operator()( const std::vector<double> & x, const std::vector<double> & y )
    	{
    		if( x[MatrixCol::RANGE] == y[MatrixCol::RANGE] )
    		{
    			if( x[MatrixCol::MEAN] == y[MatrixCol::MEAN] )
    			{
    				if( x[MatrixCol::FROM] == y[MatrixCol::FROM] )
    				{
    					return x[MatrixCol::TO] < y[MatrixCol::TO];
    				}
    				return x[MatrixCol::FROM] < y[MatrixCol::FROM];
    			}
    			return x[MatrixCol::MEAN] > y[MatrixCol::MEAN];
    		}
    		return x[MatrixCol::RANGE] > y[MatrixCol::RANGE];
    	}
    };
    

    Nachher:

    class Container
    {
    public:
    	int m_from, m_to, m_count;
    	double m_range, m_mean;
    };
    
    class SortList
    {
    public:
    	bool operator()( const Container & x, const Container & y )
    	{
    		if( x.m_range == y.m_range )
    		{
    			if( x.m_mean == y.m_mean )
    			{
    				if( x.m_from == y.m_from )
    				{
    					return x.m_to < y.m_to;
    				}
    				return x.m_from < y.m_from;
    			}
    			return x.m_mean < y.m_mean;
    		}
    		return x.m_range > y.m_range;
    	}
    };
    

    Wie würde man das besser machen? Der Nachteil an der alten Variante ist,
    dass from, to und count eben keine doubles, sondern integers sind.

    Danke für Antworten!



  • 🙄

    Es lag nicht an der Sortierklasse, sondern an verkehrter Parameterübergabe an anderer Stelle im Programm.

    So weit so gut!



  • Du sortierst auch anders, ist das gewollt?



  • Ich habe eine ganze Reihe von Sortierklassen und hab sie vereinfacht für die Forumfrage. Das sind also eigentlich zwei verschiedene.
    Danke fürs aufmerksam hingucken!


Anmelden zum Antworten