Unefizienter Abhängalgo



  • Folgende Funktion ist viel zu uneffizient

    #pragma once
    
    #include <string>
    #include <sstream>
    #include <windows.h>
    #include <deque>
    #include <algorithm>
    
    std::string ModuleInformation(std::string Name,int NameOrLocation, char Trennzeichen)
    {
    	std::string Datei;
    	char zeichen;
    	std::string DateiName,Invertiert;
    	Datei = Name;
    	int length[3];
    	int zuruk;
    	int Slashcount = 0, Slashcount2 = 0;
    	length[1] = Datei.size();
    	length[2] = 0;
    	bool foundSlash = false;
    	while (length[2]<length[1])
    	{
    		zeichen = Datei[length[2]];
    		if (zeichen == Trennzeichen)
    		{
    			Slashcount++;
    			foundSlash = true;
    		}
    		length[2]++;
    	}
    	if (foundSlash == false)
    		return "FAIL";
    	zuruk = 0;
    	while (zuruk<length[1])
    	{
    		zuruk++;
    		if (Datei[zuruk-1] == Trennzeichen)
    		{
    			Slashcount2++;
    			if (Slashcount == Slashcount2)
    				break;
    		}
    	}
    	DateiName = Datei.substr(zuruk,(length[1]-zuruk+1));
    	Invertiert = Datei.substr(0,Datei.size()-DateiName.size());
    	if (NameOrLocation == 0)
    	{
    		return DateiName;
    	}
    	else
    	{
    		return Invertiert;
    	}
    }
    

    Ich weiß aber nicht wo man was ändern könnte.
    Wenn ich sie einfach aus Spaß 3 mal aufrufe statt 1 mal dann ist die Geschwindigkeit in meinem Programm gleich 100 Mal langsamer.
    Ich brauch aber jeder Sekunde, weil es sich um ein Suchprogramm handelt (eigener Bauart).
    es braucht momentan 1 - 10 Minuten, kommt auf die Einstellungen an
    und ich würde gern was kürzen. evtl folgen weitere Funk.,

    EDIT: Zeile 30 ist eigentlich nciht nötig aber in ich brauche sie fürs aktuelle Programm (wenn sie nicht da ist wird der String nur um ein Zeichen gekürzt=



  • 1. Schmeiß mal alles raus, was keinen Einfluss auf das Ergebnis hat (wozu soll das Array merken gut sein?)
    2. Wieso arbeitest du mit Strings der Länge 1 statt mit char?



  • std::string merken[16384];
    

    😮
    Warum nimmst du keinen Vektor und außerdem sieht es mir so aus, als würdest du in merken nur einzelne Buchstaben speichern -> char.



  • Ineffizient vielleicht. Auf jeden Fall hat man Mühe, dem Code anzusehen, was er eigentlich machen soll. Versuche doch mal das Problem weiter in kleinere Teilprobleme zu zerlegen, die Du mit anderen Funktionen löst. Diesen Teilproblemen kann man so auch einen Namen geben, was das Lesen leichter macht.

    Dasselbe gilt für Variablen. length ist bei Dir ein 2-elementiges Array. Diese Eigenschaft nutzt Du aber nirgends aus. Statt length[0] und length[1] findest Du vielleicht noch bessere Namen.

    Bzgl Geschwindigkeit: Die Schnippelei in Zeile 21 ist relativ langsam, oder kann es zumindest sein, je nachdem, wie std::string implementiert worden ist. Wenn Du an einzelnen Zeichen interessiert bist, darfst Du auch ruhig char nehmen. Dafür ist es ja da. Also:

    char zeichen = einString[index];
    

    Dein 16tausend Element Array "merken" scheint auch überflüssig zu sein. Jedes Element speichert ja wirklich nur höchtens ein Zeichen.

    Wie gesagt, diese Low-level-Frickelei ist schlecht lesbar.

    Du könntest auch mal nachschauen, ob bei std::string oder im <algorithm>-HEader nützliche Funktionen drin stecken.

    Gruß,
    SP



  • Hmmm ja, das wär ne möglichkeit 😃
    soll ich ein Vektor oder ein deque nehmen ?



  • Tim06TR schrieb:

    Hmmm ja, das wär ne möglichkeit 😃
    soll ich ein Vektor oder ein deque nehmen ?

    Gar nichts. Erklär doch mal, was die Funktion machen soll (nicht wie, sondern was). Ich seh das immer noch nicht.

    Gruß,
    SP



  • btw: Wo ist eigentlich der Sinn darin ???
    Ich seh keine weitere Verwendung davon. Was ich mir da wohl gedacht hab ?
    Warscheinlich ist die Müllabfuhr nicht gekommen 😃

    EDIT: da war jemand schneller ^^

    EDIT 2: die Funktion hat aber noch ihren sinn

    sie trennt einen String nach einem bestimmten Zeichen, ist bei Pfaden ganz nütlzlich kann den Oberordner und die Datei angeben. benutzte es aber für noch mehr, deshalb ist das Trennzeichen angebbar.

    EDIT 3: gebracht hat es schon was Code wird gleich oben aktualisiert

    EDIT 4: Ups es muss was kaputt gegangen sein, das Programm friert am Ende des Prozess ein, ich guck mal mit dem debugger

    EDIT 5: So update Code nochmal jetzt ist wieder alles im Lot



  • Wäre das Folgende nicht die selbe Funktionsweise deiner einen Funktion?

    #include <iostream>
    #include <string>
    
    std::string letztesElement(const std::string &str, const char trennzeichen)
    {
    	std::string::size_type position = str.find_last_of(trennzeichen);
    	if(position != std::string::npos) {
    		return str.substr(position + 1);
    	}
    	return ""; // TODO: Besseren Rückgabewert bei "nichts finden"
    }
    
    std::string ohneLetztesElement(const std::string &str, const char trennzeichen)
    {
    	std::string::size_type position = str.find_last_of(trennzeichen);
    	if(position != std::string::npos) {
    		return str.substr(0, position + 1);
    	}
    	return ""; // TODO: Besseren Rückgabewert bei "nichts finden"
    }
    
    int main()
    {
    	std::string dateipfad("C:/Blah/Blah Blah/test.txt");
    	std::cout << "Dateiname: " << letztesElement(dateipfad, '/')
    			  << "\nPfad: " << ohneLetztesElement(dateipfad, '/') << std::endl;
    
    	return 0;
    }
    


  • 😮
    was für eine Abkürzung.
    Ja so KKÖÖÖNNTTTEEEE man das auch machen 😃
    ne jetzt mal ehrlich, danke für diese Ultimative Lösung.

    Meine hat aber viel Inovation gebraucht, ich hab mir das find last selbst gebastelt nur von vorn 🙂



  • Ey krass alder, der algo hängt voll uneffizient ab.



  • johnny rotten schrieb:

    Ey krass alder, der algo hängt voll uneffizient ab.

    😃


Anmelden zum Antworten