Funktion optimieren?



  • Hi,

    kann man diese Funktion noch weiter optimieren? Die ist mir was zu groß und ich hätte sie gerne kleiner 😞

    int bitmap::getRleSize (unsigned short *buffer, int bufferLength, int bufferWidth)
    {
        const int       run_done    = 0;
        const int       trans_run   = 1; 
        const int       color_run   = 2;
        int             state       = run_done;
        unsigned short  pixel       = 0;
        int             rleSize     = 0;
        int             index       = 0;
        int             countTrans  = 0;
        int             countColor  = 0;
        int             countLine   = 0;
        int             countTotal  = 0;
        bool            done        = false;
    
        while (!done)
        {
            switch (state)
            {
            case run_done:
                {
                    if (countTotal == bufferLength)
                    {
                        done = true;
                        break;
                    }
    
                    pixel = buffer [index];
                    state = (pixel != g_transColor) ? color_run : trans_run;
                } break;
    
            case trans_run:
                {
                    rleSize++;
                    countTrans = 0;
    
                    while (countLine < bufferWidth && buffer [index] == g_transColor)
                    {
                        countTrans++;
                        countLine++;
                        index++;
                    }
    
                    if (countLine == bufferWidth)
                        countLine = 0;
    
                    countTotal += countTrans;
                    state = run_done;
    
                    rleSize++;
                } break;
    
            case color_run:
                {
                    rleSize++;
                    countColor = 0;
    
                    while (countLine < bufferWidth && ((pixel = buffer [index]) != g_transColor))
                    {
                        countColor++;
                        countLine++;
                        index++;
                    }
    
                    if (countLine == bufferWidth)
                        countLine = 0;
    
                    countTotal += countColor;
    
                    rleSize +=  countColor;
                    state = run_done;
                } break;
            }
        }
        return (rleSize);
    }
    


  • Ja

    Willst du auc wissen wie?? 😉

    mfg CSS



  • Die beiden letzten cases sind sich so ähnlich, daß man sie wohl sehr gut verschmelzen kann. Du könntest zum Beispiel den ähnlichen Code in eine Funktion auslagern. Mußt halt nur schaun, wie Du den Kontext mitänderst, also entweder die benutzten Variablen dann aus der Funktion ins private rein, oder aber Du arbeitest mit Parametern und Rückgabewerten aus der Hilfsfunktion.

    Außerdem könntest Du versuchen dieses done-flag wegzuhaun. Statt flag setzen gleich ein return zum Beispiel.

    MfG Jester



  • Ich würde alle cases in eine eigene Funktion auslagern. Damit lässt erstens genauer profilen welcher am meisten frisst und zweitens sind übersichtliche und kleine Funktionen leichter zu optimieren. ➡ Immer erst mal auf Übersichtlichkeit optimieren.

    Dann würde ich Variablen so spät wie möglich erstellen. Bei Typen ohne komplexen Konstruktor bringt das zwar nicht viel, aber so gewöhnt man sich das an und außerdem dient es IMHO auch der Übersicht.
    Sehr oft kann man Variablen dann gleich sinnvoll initialisieren, wenn sie erst spät definiert werden.

    EDIT: Oh ja, die letzten beiden schauen wirklich sehr ähnlich aus. Codeduplizierung wird nicht geduldet. 😑


Anmelden zum Antworten