rekentijd bepalen

Status
Niet open voor verdere reacties.

Devenox

Gebruiker
Lid geworden
3 jul 2007
Berichten
6
Ik ben een beginnend C++ 'er Maar ik had onlangs een scriptje geschreven die alle priemgetallen zoekt tot een bepaald aangegeven getal. Nu als ik grotere getallen is het nogal logisch dat mijn PC er ietsje langer aan doet. Nu zou ik graag weten hoe lang.
Van het begin tot het einde dat mijn PC rekend. (Alle priemgetallen worden in .txt opgeslaan)
Ook wilde ik eens weten of hij dan alles benut van mijn CPU, maar daar zie ik steeds 50%, hij doet er dan sec of 5 over maar telkens rond de 50% ? Hoe kan ik ervoor zorgen dat hij 100% gebruikt? (oftoch 80% of meer)

Hier is het scriptje:
Code:
#include <iostream>
#include <fstream>

using namespace std;

void priem_doorsturen(int getal,ofstream& uitvoer);
void priemgetal(int i, ofstream& uitvoer);

int i, j, priem, getal;

void priemgetal(int i, ofstream& uitvoer) {
	// pre: een positief geheel getal tussen 3 en 100
    // ret: een priemgetal tussen 3 en 100 of niets
	
	priem = 1;
	//loop van 2 tot n-1
	for (j=2; j<i; j++) 
	{
		//als de rest 0 is, is het geen priemgetal en gaan we uit de loop en krijgt 'priem' als waarde '0'.
		//indien geen enkele rest de waarde 0 heeft, is het een priemgetal en blijft 'priem' zijn standaardwaarde '1' behouden.
		if (i % j == 0)
		{
			priem = 0;
			break;
		}
	}

	//controleren welke waarde priem heeft, als hij niet gelijk is aan 0 is het dus een priemgetal
	if (priem != 0) 
	{
		uitvoer << i << "\n";
	}

}

void priem_doorsturen(int getal, ofstream& uitvoer)
{
	for (i=3; i<=getal; i++)
	{
		priemgetal(i, uitvoer);
	}
}

int main(void)
{
	ofstream fout;
	fout.open("priem.txt");
	cout << "Tot welk getal moeten er priemgetallen aangemaakt worden : ";
	cin >> getal;

	priem_doorsturen(getal, fout);
	cout << "De priemgetallen zijn aangemaakt en verstuurd naar 'priem.txt':\n\n";

	fout.close();

	system("pause");
	return 0;
}

Alvast bedankt,
Devenox
 
Rekentijd bepalen kan met een simpel sommetje, als je script start vraag je de tijd op en als het stopt weer, die trek je van elkaar af.

Code:
DWORD dwStartTijd = GetTickCount();

..
..

printf("De berekening duurde: %u", GetTickCount() - dwStartTijd);

Dat het process op 50% draait komt vanwege dualcore. Als je de volle 100% wilt zul je meerdere threads moeten gebruiken.
 
Bedankt, inderdaad logische oplossing. Dus als je CPU 1 iets moet bereken (bijvoorbeeld hier het vinden van priemgetallen) dan gebruikt deze maar 1 core?

Waar moet deze regels dan precies komen? Ik ben nog maar beginneling..
en wat wil die DWORD zeggen?
 
Laatst bewerkt:
DWORD is een typedef van unsigned long, in windows.h
Het is een doubleword, dus een 32bit variabele. Microsoft heeft deze en nog meer types gedefinieerd voor de toekomst en handigheid, een unsigned long hoeft niet meer 32 bit te zijn op een 64 bit compiler.


Over dat dualcore verhaal, een process of beter gezegt een thread kan inderdaad maar op een enkele core of CPU draaien. Als je beide cores wilt benutten zul je het werk moeten verdelen en ieder deel in een aparte thread moeten behandelen. Het gebruik van threads heeft echter een aantal haken en ogen en is gevorderd materiaal :rolleyes: Ik stel dus voor om het bij een single-thread app te houden.

Als je toch meer wilt weten, ik kan je genoeg uitleggen maar google nog veel meer :p
 
Dat leek me al logisch dat multi-threading niet beginnersniveau zou zijn. Anders hadden zowat alle programma's multi-threading support.

Maar waar zet je die code in mijn code, ik krijg voordurend errors.

Ook zou ik graag weten waar ik uitgebreide tuts moet vinden? Met uitgebreid bedoel ik gewoon een tut die wat langer is dan 5blz en wat verder gaat dan hello world. :mad:
 
Code:
#include <windows.h>
#include <iostream>
#include <fstream>

using namespace std;

void priem_doorsturen(int getal,ofstream& uitvoer);
void priemgetal(int i, ofstream& uitvoer);

int i, j, priem, getal;

void priemgetal(int i, ofstream& uitvoer) {
	// pre: een positief geheel getal tussen 3 en 100
    // ret: een priemgetal tussen 3 en 100 of niets
	
	priem = 1;
	//loop van 2 tot n-1
	for (j=2; j<i; j++) 
	{
		//als de rest 0 is, is het geen priemgetal en gaan we uit de loop en krijgt 'priem' als waarde '0'.
		//indien geen enkele rest de waarde 0 heeft, is het een priemgetal en blijft 'priem' zijn standaardwaarde '1' behouden.
		if (i % j == 0)
		{
			priem = 0;
			break;
		}
	}

	//controleren welke waarde priem heeft, als hij niet gelijk is aan 0 is het dus een priemgetal
	if (priem != 0) 
	{
		uitvoer << i << "\n";
	}

}

void priem_doorsturen(int getal, ofstream& uitvoer)
{
	for (i=3; i<=getal; i++)
	{
		priemgetal(i, uitvoer);
	}
}

int main(void)
{
	ofstream fout;
	fout.open("priem.txt");
	cout << "Tot welk getal moeten er priemgetallen aangemaakt worden : ";
	cin >> getal;

	DWORD dwTijd = GetTickCount();
	priem_doorsturen(getal, fout);
	cout << "De priemgetallen zijn aangemaakt en verstuurd naar 'priem.txt', het duurde " << GetTickCount() - dwTijd << "ms\n\n";

	fout.close();

	system("pause");
	return 0;
}

Om goed te leren programmeren kun je beter een goed boek kopen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan