Kurze Methode optimieren



  • Hi!

    Da ich schon öfter gesehen habe, dass einige hier kleine Tricks haben um Programme effizienter zu schreiben, wollte ich wissen was man bei folgender Methode verbessern könnte:

    // ----------------------------------------------------------------------------
    void CCurve::AddData(double data)
    // ----------------------------------------------------------------------------
    {
    	// y moves from right to left:
    	// Shift y array left and assign new value to the last y[] field
    	for (int i = 0; i < PLOT_BUFFER - 1; ++i)	
    		m_DataY[i] = m_DataY[i+1];
    
    	// Add the new value to the last field
    	m_DataY[PLOT_BUFFER-1] = data;
    
    	// Store each value
    	m_OldYDataList.push_back( data );
    }
    

    Erläuterung: Sie gehört zu qwt, damit kann man Graphen mit Qt darstellen und ich hab mich an dem qwt-Beispiel orientiert. Wenn ein Neuer Wert hinzuegfügt werden soll, wandern die alten alle ein Feld nach links, der erste Wert wird weggeworfen und im letzten Arrayfeld wird der neue Wert hinzugefügt. Das Array ist 100 Felder groß. Aufgerufen wird die Methode so wie möglich.

    Bin dankbar für jeden Tipp 🙂



  • Brauchst du Indexzugriff auf m_Data? Ansonsten wäre hier eine Liste angebrachter.



  • .filmor schrieb:

    Brauchst du Indexzugriff auf m_Data? Ansonsten wäre hier eine Liste angebrachter.

    Oh Mist, die Datentypen. Also ich brauche keinen Indexzugriff auf m_Data und
    m_DataY ist ein double-array, kein std::vector (hab mich wie gesagt an dem qwt-Examples orientiert). m_OldYDataList ist eine Liste.

    Kann man da m_DataY ein normales Array ist irgendwelche Tricks verwenden ;)?



  • Kaum. Du kannst höchstens sowas wie einen Ringbuffer implementieren. Du nimmst ein zusätzliches Element als Zeiger auf den Anfang und machst dann einen Überlauf, damit du nicht über das Array hinaus kommst:

    void CCurve::AddData(double data)
    {
        m_DataY[m_DataStart] = data;
        m_DataStart = (m_DataStart + 1) % PLOT_BUFFER;
    
        // Store each value
        m_OldYDataList.push_back( data );
    }
    


  • Die for-Schleife könnte er theoretisch auch durch memmove ersetzen.



  • Und, was soll das bringen?
    Er kann auch std::copy verwenden, das Problem bleibt dasselbe (nämlich das umherfrachten des Speichers).



  • .filmor schrieb:

    Und, was soll das bringen?
    Er kann auch std::copy verwenden, das Problem bleibt dasselbe (nämlich das umherfrachten des Speichers).

    Kommt drauf an wie gut der Compiler optimiert. Es ist ein Unterschied ob die CPU-internen Schleifenbefehle (movsd, etc.) oder eine selbsterstellte Schleife (mov, jmp, etc.) verwendet wird.



  • Und nichts von alledem wird meine Lösung schlagen :p.
    O(n) vs. O(1)



  • .filmor schrieb:

    Und nichts von alledem wird meine Lösung schlagen :p.
    O(n) vs. O(1)

    O(1) vs. O(1) wegen der garantie
    "Das Array ist 100 Felder groß"



  • Hatte ich überlesen. Dann halt so:

    Schreibzugriffe:
    1. Verschieben: ~100
    2. Ringspeicher: 2

    :p


Log in to reply