Code bedarf Prüfung zwecks etwaiger Geschwindigkeitsverluste



  • Also habe folgenden Code in einer meiner DLL's und möchte wissen was man verbessern kann, weil es mir schon etwas umständich erscheint, was ich da geschrieben habe,
    funktionieren tut es aber tadelos, dieser Code liest ein, welches das letzte Snake_[Nummer].log ist und geht 1 höher. Schaut es euch an:

    FILE *file_sample=0;
            bool datei_vorhanden=false;
            int int_buffer;
            string str_buffer_anfang,str_buffer_ende,str_buffer_endung,null_int_str_buffer,neu_in_welche_datei;
            ostringstream str_int;
            while(true)
            {
                    file_sample=fopen(in_welche_datei.c_str(),"r+");
                    if(file_sample==0)datei_vorhanden=false;
                    if(file_sample!=0)datei_vorhanden=true;
                    if(datei_vorhanden==true)
                    {
                            str_buffer_anfang=in_welche_datei.substr(0,in_welche_datei.length()-6);
                            str_buffer_ende  =in_welche_datei.substr(in_welche_datei.length()-6,2);
                            str_buffer_endung=in_welche_datei.substr(in_welche_datei.length()-4,4);
                            int_buffer=atof(str_buffer_ende.c_str());
                            int_buffer++;
                            ostringstream str_int;
                            str_int<<int_buffer;
                            string int_str_buffer(str_int.str());
                            if(int_buffer< 10)null_int_str_buffer="0"+int_str_buffer;
                            if(int_buffer>=10)null_int_str_buffer=int_str_buffer;
                            in_welche_datei=str_buffer_anfang+null_int_str_buffer+str_buffer_endung;
                            if(int_buffer==50)
                            {
                                    int counter=int_buffer;
                                    string remove_buffer_int,remove_datei;
                                    while(true)
                                    {
                                            ostringstream str_buffer_int;
                                            str_buffer_int<<counter;
                                            if(counter<10 )remove_buffer_int="0"+str_buffer_int.str();
                                            if(counter>=10)remove_buffer_int=str_buffer_int.str();
                                            remove_datei=in_welche_datei.substr(0,in_welche_datei.length()-6)+remove_buffer_int+str_buffer_endung;
                                            remove(remove_datei.c_str());
                                            counter--;
                                            if(counter==1)
                                            {
                                                    int_buffer=01;
                                                    break;
                                            }
                                    }
                            }
                    }
                    if(datei_vorhanden==false)
                    {
                            neu_in_welche_datei="XXXXX"+in_welche_datei;
                            const char *const_char_buffer=neu_in_welche_datei.c_str();
                            char *rueckgabe_wert=const_cast<char*>(const_char_buffer);
                            return rueckgabe_wert;
                    }
            }
    

    zur Erklärung, wie gesagt wird diese Funktion aus einer dll gelesen und man sollte std::string nicht mit dlls benutzen. Ich habe es trotzdem gemacht und gesehen warum nicht, wenn man einen char* oder string zurückgibt, macht er aus den ersten 5 Zeichen des strings kauderwelch, da diese aber wichtig sind habe ich "XXXXX" vorangestellt und später wird dies dann wieder weggemacht.

    Ich hoffe ihr könnt die "produktivität" des Codes erhöhen und somit Geschwindigkeitseinbuße einschränken.



  • was mir noch einfallen würde, ist die Überprüfungen zusammenzufassen:

    sample=fopen(...)
    if(sample==0)
      return filename;
    else
      //erzeuge neuen Namen
    

    Außerdem ist es unökonomisch, in jeder Runde den Namen zu zerlegen und wieder zusammenzubauen - merk' dir lieber die aktuelle Anzahl zwischen den einzelnen Schleifendurchläufen.





  • Benutze Borland 6 hat der sowas auch?



  • Da solltest Du im BCB-Forum nachfragen...


Anmelden zum Antworten