Codeoptimierung

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi@all

So, dieses Thema ist nicht das wichtigste, aber für mich persönlich im Moment sehr wichtig.

Ich leifere mir im Moment ein "Duell" in C++ mit einem Freund von mir, wer das schnellste Programm schreibt, das irgendwelche Berechnungen macht. :)

Wir wollen wöchentlich ein neues Duell machen, diese Woche fangen wir leicht an, die Aufgabe lautet:

Wer den Prozessor am schnellsten von 1 bis 1.000.000.000 zählen lässt, hat gewonnen.

Ist relativ simpel, und ich habs auch schnell geschafft. Jedoch liegt die Dauer pro Durchgang noch immer bei ~2500ms...

Ich will aber unbedingt noch die 2000ms Grenze unterschreiten (wenn möglich)...

Ich hab den Quelltext schon gut optimiert, will aber noch das letzte bischen rauskitzeln.

Code:
#include <iostream>
#include <time.h>
#include <windows.h>
#pragma comment(lib, "winmm.lib")

using namespace std;

int main()
{
	int m,x,s,e,d; 
       // m ist die Zahl, wie hoch er raufzählen soll,
       // x ist die Zahl die zählt,
       // s, e ,d sind für die Zaitmessung (start, ende, dauer)

	m=1000000000;

	cout << "Es werden alle Zahlen von 1 bis 1.000.000.000 gezaehlt." << endl << endl;
	
	for(int r=0;r<5;r++)
	{
		x=0;
		s=timeGetTime();

		do x++; while(x<m);

		e=timeGetTime();
		d=e-s;

		cout << "Durchgang " << r+1 << "   Dauer: " << d << "ms" << endl;
	}

	cout << endl << "<----- ENDE ----->" << endl;
}

Joa, wie schon gesagt, ich wills schneller machen. Geht da noch irgendwas?

Danke schon mal für eure Antworten ;)
 
Hi.

Da kannst du im Grund nicht viel machen. Du könntest allerdings eine Technik einsetzen die sich "loop unrolling" nennt. (falls das dein Compiler nicht sowieso schon macht)

Das Problem ist, das du bei jedem Schleifendurchlauf den Test machst ob x < m ist. Das ist nicht unbedingt nötig. Man kann ja z.B. in der Schleife die Anweisung gleich 10 mal ausführen bevor man die Variable x prüft:
C++:
int m10 = m / 10 * 10;

do {
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
  ++x;
} while (x < m10);
// den Rest hochzählen
while (x < m) ++x;
Gruß
 
Wow, danke, das bringt echt doch einiges, hier mal meine Lösung;

Code:
#include <iostream>
#include <time.h>
#include <windows.h>
#pragma comment(lib, "winmm.lib")

using namespace std;



int main()
{
	unsigned int x;
	unsigned int const m=200000000;
	int s,e;

	cout << "Es werden alle Zahlen von 1 bis 1.000.000.000 gezaehlt." << endl << endl;
	for(int r=0;r<5;r++)
	{
		x=1;
		s=timeGetTime();

		do 
		{
			x++;
			x++;
			x++;
			x++;
			x++;
		}
		while(x<m);

		e=timeGetTime();

		cout << "Durchgang " << r+1 << "   Dauer: " << e-s << "ms" << endl;
	}

	cout << endl << "<----- ENDE ----->" << endl;

	return 0x666;
}

Das ganze bingt mich von 2516ms runter auf unglaubliche 451ms :D


DANKE, ERLEDIGT!
 
hi,

sorry wenn ich das thema nochmal anschneide, aber könntest du dann nicht einfach so oft wie nötig x++ schreiben?
 
Naja, wenn das so bleibt mit der Zeit und nicht langsamer wird kommst du auf 2255ms
Also immer noch weniger :P
 
Aber dann müsste er das doch 1.000.000.000 Mal schreiben.... wazu gibt es denn Schleifen^^
 
klar, aber wozu gibts strg+c und strg+v ^^? Also wenns da wircklich darum geht nur schneller zu sein, egal wie der Code aussieht würde ichs mal versuchen. Is aber nur so ne idee, hab noch nie in C++ programmiert :rolleyes:
 
Uups, danke, ich hatte einen Denkfehler drinnen, jetzt siehjt die schleife so aus ;)

Code:
m=1000000001;
		do 
		{
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
			x++;x++;x++;x++;x++;x++;x++;x++;x++;x++;
		}
		while(x<m);

danke ^^

also, pro durchlaufen der schleife wird die x um 1000 (einzel natürlich) hochgezählt. Mehr bringt nichts mehr, mit 10.000 mal wirds dauerts dann zum Beispiel schon 3x so lange...
 
Zurück