Codeoptimierung

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Codeoptimierung

Beitrag von sukka » Fr Dez 05, 2008 5:28 pm

Hi,

ich hab mal versucht so zu tun, als würde ich wissen was ich tue... das gelingt nicht immer...

wie schaffe ich es die überflüssigen Zeilen aus meinen bedingten Anweisungen zu tilgen?

Code: Alles auswählen

#include <iostream>
using namespace std;

void addieren (int iz1, int iz2)
{
	cout <<iz1 << "+" <<iz2 <<"="<<(iz1+iz2);
}
void subtrahieren (int iz1, int iz2)
{
	cout <<iz1 << "-" <<iz2 <<"="<< (iz1-iz2);
}
void dividieren (int iz1, int iz2)
{
	cout <<iz1 << "/" <<iz2 <<"="<< (iz1/iz2);
}
void multiplizieren (int iz1, int iz2)
{
	cout <<iz1 << "*" <<iz2 <<"="<< (iz1*iz2);
}

void addieren (float z1, float z2)
{
	cout <<z1 <<"+"<<z2 <<"="<< (z1+z2);
}
void subtrahieren (float z1, float z2)
{
	cout <<z1 <<"-"<<z2 <<"="<< (z1-z2);
}
void dividieren (float z1, float z2)
{
	cout <<z1 <<"/"<<z2 <<"="<< (z1/z2);
}
void multiplizieren (float z1, float z2)
{
	cout <<z1 <<"*"<<z2 <<"="<< (z1*z2);
}

int main (void)
{
	char choicerepeat ='n';
	char choiceintdouble;
	float z1;
	int iz1;
	char rechenart;
	float z2;
	int iz2;
	do
	{
		cout << "Minirechner: (i)nteger oder (d)ouble ? ";
		cin >> choiceintdouble;
		cout << "Zahl 1 = ? ";
		cin >> z1;
		cout << "Rechenart (+ - * /) ? ";
		cin >> rechenart;
		cout << "Zahl 2 = ? ";
		cin >> z2;
		if (choiceintdouble =='i')
		{
			iz1=z1;
			iz2=z2;
			if (rechenart == '*')
			multiplizieren (iz1,iz2);
			else if (rechenart == '+')
			addieren (iz1,iz2);
			else if (rechenart == '-')
			subtrahieren (iz1,iz2);
			else if (rechenart == '/')
			dividieren (iz1,iz2);
			else
				cout << "Falsche Eingabe!";
		}
		else if (choiceintdouble =='d')
		{
			if (rechenart == '*')
			multiplizieren (z1,z2);
			else if (rechenart == '+')
			addieren (z1,z2);
			else if (rechenart == '-')
			subtrahieren (z1,z2);
			else if (rechenart == '/')
			dividieren (z1,z2);
			else
				cout << "Falsche Eingabe!";
		}
		else
		{		
			cout << "Falsche Eingabe!" <<endl;
		}
		cout << endl << "Noch einmal (j/n)";
		cin >> choicerepeat;
	}while (choicerepeat == 'j');

	return 0;
}

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Codeoptimierung

Beitrag von Dirty Oerti » Fr Dez 05, 2008 5:40 pm

Tag :)

Also...
was ich dir zuerst vorschlagen würde:
Definiere die Funktionen als inline, dass dürfte ein bisschen zur Optimierung beitragen.

Dann...ob es dadurch schneller geht weiß ich nicht, ich denke fast eher nicht, aber deine Funktionen kannst du dir per Template erleichtern:

Code: Alles auswählen

template <T>
void addieren(T sum1, T sum2)
{
    cout << sum1 << "+" << sum2 << "=" << (sum1+sum2);
}
Dann kannst du die Funktion sowohl bei floats als auch bei Integern und sowieso bei allen Typen, die die Operatoren "+" und "<<" unterstützen verwenden :)


Was ich auch noch etwas kritisch betrachte ist, dass du erst die Zahlen abfrägst und dann erst unterscheidest, ob du Integer oder Floats berechnest.
Pack den Part mit dem Eingeben der beiden Zahlen in jeweils den Teil mit Integer und auch einmal in den Teil mit Floats, sonst kannst du nicht den vollen Wertebereich der Integer benutzen.

Ansonsten fällt mir gerade nichts auf, was man da optimieren könnte.
Da es auch eine Anwendung ist, die relativ oft auf Benutzereingaben warten muss, bringt dir das optimieren auch nicht so viel in dieser Schleife.

MfG
Daniel
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Codeoptimierung

Beitrag von Xin » Fr Dez 05, 2008 6:11 pm

Dirty Oerti hat geschrieben:Dann...ob es dadurch schneller geht weiß ich nicht, ich denke fast eher nicht, aber deine Funktionen kannst du dir per Template erleichtern:
Hey, Dirty... schau Dir den C(!)-Code an und überlege kurz, ob C++-Templates nicht vielleicht etwas vorgreifen.
@sukka: Vergiss Templates, da kommen wir später mal drauf zurück.
Dirty Oerti hat geschrieben:Dann kannst du die Funktion sowohl bei floats als auch bei Integern und sowieso bei allen Typen, die die Operatoren "+" und "<<" unterstützen verwenden :)
Integer werden implizit auf double konvertiert.
Das bedeutet, man kann die Wiederholung der Funktionen auch weglassen. Das hier - wie es jetzt ist - könnte als Geschwindigkeits-Optimierung durchgehen, weil die Konvertierung von int nach float nicht gemacht werden muss.

Ob Du die Funktionen drinlässt oder nicht - es optimiert also auf Geschwingkeit wenn Du es drin lässt - oder auf Größe, wenn Du es konvertieren lässt.
Dirty Oerti hat geschrieben:Was ich auch noch etwas kritisch betrachte ist, dass du erst die Zahlen abfrägst und dann erst unterscheidest, ob du Integer oder Floats berechnest.
Pack den Part mit dem Eingeben der beiden Zahlen in jeweils den Teil mit Integer und auch einmal in den Teil mit Floats, sonst kannst du nicht den vollen Wertebereich der Integer benutzen.
Warum unterscheidest Du, sukka, überhaupt zwischen Integers und Floats?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Codeoptimierung

Beitrag von Dirty Oerti » Fr Dez 05, 2008 6:28 pm

Xin hat geschrieben:Hey, Dirty... schau Dir den C(!)-Code an und überlege kurz, ob C++-Templates nicht vielleicht etwas vorgreifen.
@sukka: Vergiss Templates, da kommen wir später mal drauf zurück.
C-Code ?!?!?
"cout" ? "using namespace" ?
Ich würde eher darauf tippen, dass das C++ Code ist, oder nicht?
Xin hat geschrieben:es optimiert also auf Geschwingkeit wenn Du es drin lässt - oder auf Größe, wenn Du es konvertieren lässt.
Auf Geschwindigkeit optimiert es, wenn er es doppelt schreibt.
Den es wird ja deswegen nicht doppelt ausgeführt.
Er spart sich im Intergerteil sogar die Zuweisungen zu den Integervariablen :)

-------------------
*Edit* Kann es sein, dass ich dich, Xin, falsch verstanden habe und du genau das meintest ? ^^
also cin in den Schleifen doppelt => bessere Geschwindigkeit + größerer Wertebereich
cin außerhalb gibt eine kleinere Datei
?
----------------

Heißt: Es ist (ein wirklich nano kleines bisschen) schneller und auf Größe optimiert, wenn es in den if-Teilen steht :)

Xin hat geschrieben:Warum unterscheidest Du, sukka, überhaupt zwischen Integers und Floats?
Habe ich mich auch gefragt :)
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Codeoptimierung

Beitrag von Xin » Fr Dez 05, 2008 6:34 pm

Dirty Oerti hat geschrieben:
Xin hat geschrieben:Hey, Dirty... schau Dir den C(!)-Code an und überlege kurz, ob C++-Templates nicht vielleicht etwas vorgreifen.
@sukka: Vergiss Templates, da kommen wir später mal drauf zurück.
C-Code ?!?!?
"cout" ? "using namespace" ?
Ich würde eher darauf tippen, dass das C++ Code ist, oder nicht?
Okay... cout ist C++ und kein C... aber schau Dir das Programm an und überlege Dir kurz, was er lernt. ;-)
High-Level C++ Techniken sucht er vermutlich nicht, hier geht's eher um Funktionen. ;-)
Dirty Oerti hat geschrieben:
Xin hat geschrieben:es optimiert also auf Geschwingkeit wenn Du es drin lässt - oder auf Größe, wenn Du es konvertieren lässt.
Auf Geschwindigkeit optimiert es, wenn er es doppelt schreibt.
Den es wird ja deswegen nicht doppelt ausgeführt.
Er spart sich im Intergerteil sogar die Zuweisungen zu den Integervariablen :)

-------------------
*Edit* Kann es sein, dass ich dich, Xin, falsch verstanden habe und du genau das meintest ? ^^
Yepp.
Dirty Oerti hat geschrieben:
Xin hat geschrieben:Warum unterscheidest Du, sukka, überhaupt zwischen Integers und Floats?
Habe ich mich auch gefragt :)
Fragen wir sukka?
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Codeoptimierung

Beitrag von Dirty Oerti » Fr Dez 05, 2008 6:37 pm

Xin hat geschrieben:Okay... cout ist C++ und kein C... aber schau Dir das Programm an und überlege Dir kurz, was er lernt. ;-)
High-Level C++ Techniken sucht er vermutlich nicht, hier geht's eher um Funktionen. ;-)
Ich wollte es nur angemerkt haben :)
Wobei...eine Optimierung würde durch den Gebrauch von Templates hier nicht entstehen, nehme ich an... ?
Xin hat geschrieben:Yepp.
Dann bitte ich aufrichtig um Entschuldigung :)
Xin hat geschrieben:Fragen wir sukka?
Fragen wir ihn.

Ich nehme an, er möchte sicherstellen, dass auch Kommazahlen verwendet werden können.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

sukka
Beiträge: 42
Registriert: Do Jul 17, 2008 7:49 pm

Re: Codeoptimierung

Beitrag von sukka » Fr Dez 05, 2008 8:54 pm

So viel Wind um so ein popliges Programm :)

ich wollte einfach nur die Überladung testen und unterscheide deswegen zwischen integer und float, ein anderes Ziel steckt gar nicht dahinter.
Meine Frage ging eigentlich eher aufs Thema Zeilen sparen, mir fällt nur keine sinnvollere Möglichkeit ein, die Funktionen aufzurufen außer über die bedingte Anweisung, nur würd ich das gern nicht doppelt machen, weil 2mal alles eintippen ist doch auch irgendwie doof. Geschwindigkeit spielt dabei erstmal weniger eine wichtige Rolle

Code: Alles auswählen

#include <iostream>
using namespace std;

void addieren (int iz1, int iz2)
{
	cout <<iz1 << "+" <<iz2 <<"="<<(iz1+iz2);
}
void subtrahieren (int iz1, int iz2)
{
	cout <<iz1 << "-" <<iz2 <<"="<< (iz1-iz2);
}
void dividieren (int iz1, int iz2)
{
	cout <<iz1 << "/" <<iz2 <<"="<< (iz1/iz2);
}
void multiplizieren (int iz1, int iz2)
{
	cout <<iz1 << "*" <<iz2 <<"="<< (iz1*iz2);
}

void addieren (float z1, float z2)
{
	cout <<z1 <<"+"<<z2 <<"="<< (z1+z2);
}
void subtrahieren (float z1, float z2)
{
	cout <<z1 <<"-"<<z2 <<"="<< (z1-z2);
}
void dividieren (float z1, float z2)
{
	cout <<z1 <<"/"<<z2 <<"="<< (z1/z2);
}
void multiplizieren (float z1, float z2)
{
	cout <<z1 <<"*"<<z2 <<"="<< (z1*z2);
}

int main (void)
{
	char choicerepeat ='n';
	char choiceintdouble;
	float z1;
	int iz1;
	char rechenart;
	float z2;
	int iz2;
	do
	{
		cout << "Minirechner: (i)nteger oder (d)ouble ? ";
		cin >> choiceintdouble;
		if (choiceintdouble =='i')
		{
		cout << "Zahl 1 = ? ";
		cin >> iz1;
		cout << "Rechenart (+ - * /) ? ";
		cin >> rechenart;
		cout << "Zahl 2 = ? ";
		cin >> iz2;
			if (rechenart == '*')
			multiplizieren (iz1,iz2);
			else if (rechenart == '+')
			addieren (iz1,iz2);
			else if (rechenart == '-')
			subtrahieren (iz1,iz2);
			else if (rechenart == '/')
			dividieren (iz1,iz2);
		}
		else if (choiceintdouble =='d')
		{
			cout << "Zahl 1 = ? ";
			cin >> z1;
			cout << "Rechenart (+ - * /) ? ";
			cin >> rechenart;
			cout << "Zahl 2 = ? ";
			cin >> z2;
			if (rechenart == '*')
			multiplizieren (z1,z2);
			else if (rechenart == '+')
			addieren (z1,z2);
			else if (rechenart == '-')
			subtrahieren (z1,z2);
			else if (rechenart == '/')
			dividieren (z1,z2);
		}
		else
		{		
			cout << "Falsche Eingabe!" <<endl;
		}
		cout << endl << "Noch einmal (j/n)";
		cin >> choicerepeat;
	}while (choicerepeat == 'j');

	return 0;
}
hier jetzt das etwas abgeänderte Dingen

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Codeoptimierung

Beitrag von Xin » Sa Dez 06, 2008 12:10 am

sukka hat geschrieben:ich wollte einfach nur die Überladung testen und unterscheide deswegen zwischen integer und float, ein anderes Ziel steckt gar nicht dahinter.
Meine Frage ging eigentlich eher aufs Thema Zeilen sparen, mir fällt nur keine sinnvollere Möglichkeit ein, die Funktionen aufzurufen außer über die bedingte Anweisung, nur würd ich das gern nicht doppelt machen, weil 2mal alles eintippen ist doch auch irgendwie doof. Geschwindigkeit spielt dabei erstmal weniger eine wichtige Rolle
In dem Sinne hat Dirty Oerti schon recht - Du kannst die Redundanz mit Templates entfernen und hättest damit dann auch schon addieren von Strings, Doubles usw. mit erschlagen.
sukka hat geschrieben:hier jetzt das etwas abgeänderte Dingen
Du könntest noch die ganzen if-Abfragen in ein switch machen, das spart einiges an Zeilen.

Statt Zeilen zu sparen, solltest Du aber erstmal auf die richtige Einrückung achten. Es ist nicht so wichtig, dass das Programm besonders kurz ist, sondern dass es leicht zu lesen ist ^^
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: Codeoptimierung

Beitrag von Dirty Oerti » Sa Dez 06, 2008 11:54 am

Auch ein paar Kommentare würde ich einfügen :)
Ist bei diesem Programm zwar noch nicht so wichtig, aber sobald es an etwas umfangreicheres geht kann das viel helfen.
:)

Man sollte es sich einfach angewöhnen.
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Antworten