Brauche optimierungshilfe



  • Hi,

    ich wollt mal fragen ob mir jemand ne kleine funktion optimieren kann oder mir sagen kann: WAS man da noch optimieren kann, damit ichs selber machen kann 🙂

    Hier die Funktion und eine Struktur:

    class CFileTileObject
    {
    public:
        string typ;
        int x;
        int y;
        int frame;
        int coll;
    };
    
    CFileTileObject parseLine(const char *s)
    {
        int     len     = strlen(s);
        char    *tmp    = new char[len + 1];
    
        memcpy(tmp, s, len + 1);
    
        CFileTileObject cont;
    
        char    *tok    = strtok(tmp, ",");
        string  toks;
        int     runner  = 0;
    
        while (tok) 
        {
          toks = tok;
    
          if (runner == 0)
            cont.typ = toks;
          else if (runner == 1)
              cont.x = atoi (toks.c_str());
          else if (runner == 2)
            cont.y = atoi (toks.c_str());
          else if (runner == 3)
              cont.frame = atoi (toks.c_str());
          else if (runner == 4)
              cont.coll = atoi (toks.c_str());
    
          tok = strtok(NULL, ",");
          runner++;
        }
        delete [] tmp;
        return cont;
    }
    

    was mich hauptsächlich stört ist dieser dicke if else block. kann man diese funktion nicht irgendwie "eleganter" machen? 😕



  • Statt der if-Kolonne könntest du einen switch nehmen.
    Die Members aus der Klasse nehmen, die nicht gebraucht werden (seh nirgends, wo sie verwendet werden, aber du hast sicher noch andere Klassenmethoden).

    In deiner Funktion wird eh nirgendwo this verwendet, sondern ein neues Objekt cont erstellt, soweit ich das seh. Dann mach das doch lieber als ctor oder so.

    Keine Optimierung, aber trotzdem einfacher: std::string verwenden.

    ChrisM



  • schonmal probiert die else ifs durch

    switch (var)
    {
    case 1 :<hier kommt der code> break;
    .
    .
    .
    default:<anderer code>break;
    }
    

    zu ersetzen?



  • Danke für die Tipps 🙂 für weitere Tipps bin ich gern offen 🙂



  • ups... das schon jemand anderes das mit dem switch geschrieben hat hab ich nich gesehen



  • toks = tok;

    diese zeile kostet dir viel.

    denn du rufst dann
    toks.c_str() auf, was teuer ist...

    also lass toks weg, und arbeite nur mit tok

    die namen sind übrigens nicht gerade gut gewählt.
    ansonsten:
    uU ein eigenes atoi schreiben - da musst du aber profilen

    lass die schleife weg - dann sparst du dir runner und die vielen vergleiche!

    uU ist es schneller strpos zu verwenden anstatt von strtok (damit könntest du dir das memcpy und das new ersparen - müsstest aber n bisschen tricksen!)


Anmelden zum Antworten