Pimp My C++ Function

  • Onderwerp starter Onderwerp starter arre
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

arre

Gebruiker
Lid geworden
14 apr 2003
Berichten
485
Hey iedereen,
Ik heb onlangs een Decoder gemaakt voor een belachelijk simpel algoritme. Het programma'tje werkt nu naar behoren op wat de gedecodeerde data beftreft, maar niet echt op vlak van snelheid.
Ik heb namelijk besloten om in c++ dit tooltje te schrijven voor de simpele reden dat ik vond dat het in visual basic te traag ging...

Hier is de code van de functie waar het allemaal om gaat:

Code:
void decode(int len){
	// decode it!
	int f = 0,g = -1, cd1,cd2,cd3,cd4,brute,t;
	bool gotit = false;
	for(i = len;i < signed(strlen(aesc.hash) - 1);i++){
		f++;
		g++;
		if(f > 255) { f = f - 256; printf("%d Percent\n",int((1/float((signed(strlen(aesc.hash)))/i))*100) ); }
		cd1 = int(aesc.hash[i]); if(cd1 < 1){cd1 = cd1 + 256;}
		if(cd1 == aesc.decodevalue) {
			cd3 = int(aesc.hash[i+1]); if(cd3 < 1){cd3 = cd3 + 256;}
			cd4 = int(aesc.hash[i+2]); if(cd4 < 1){cd4 = cd4 + 256;}
			// Two possibilities
			if(cd3 == 234 && cd4 == 243){ 
				i = i + 2; 
				cd2 = cd1 - f;
			} else {
				cd2 = cd3 + 255 - f;
				i = i + 1;
			}
		} else{
			cd2 = cd1 - f;
		}
		// Starting classic decodement
		brute = 1;
		gotit = false;
		do{
			t = 200 - brute - aesc.decodevalue;
			while (t<1) {
				t = t + 255;
			}
			while (t > 255) {
				t = t - 255;
			}
			if(char(t) == char(cd2)){
				buffer[g] = char(brute);
				gotit = true;
			}
			brute++;
			if(brute > 256){ printf("*****ERROR*****"); exit(1); }

		} while ((gotit == false));

	}
	// Entire decodement is now complete...
	strncpy(aesc.result,buffer,strlen(aesc.hash)-len-1);
}
Nu waar het eigelijk om gaat is alles tussen de FOR loop. Het gedoe van if cd = decodevalue is zeer zeldzaam en het percentage was gewoon om eens te zien wat dat gaf:) Normaal gezien stond dat er niet eens bij

Nu met die code (zonder het percentage-display dan) Deed hij iets meer dan 256 karakters per seconde. Dat wil zeggen dat hij per seconde die for loop ongeveer 300 keer afgaat. Dit is op een 633 Mhz processor (lol ja ik weet het... Koop er wel een nieuwe.. ooit). Ik redeneerde: 633 Mhz = 633 000 commando'tjes per seconde (geen idee of dit klopt maar ja). Als je dan zou berekenen hoeveel commando's er dan in die for-loop staan kom je iets van een 2000 uit...

De vraag is, heb ik een rekenfout gemaakt? Of anders, vanwaar komen nu in hemelsnaam die 2000 commando's?? Ok, ik weet wel dat hij dat compileert naar assembly maar dat is meer dan 100 assembly commands per lijn dat ik heb staan???!!!

Als jij weet hoe ik mijn functie wat kan versnellen, plz tell me:)

Alvast bedankt!

Ok, mss wel een beetje dom om te vragen waar al die commando's vandaan komen als je de onderste do while loop ziet... Hmm, maar buiten dat?:) enige advies over efficientere code?

Euhm, laat ook maar:P
Per ongeluk heb ik iets gedaan blijkbaar. Het decoderen van een file van 300 kb dat normaal een kwartier duurde duurt nu 3 seconden, 1 megabyte = 5 seconden (in vb is 1 MB een kwartier:P)

voor wie zich echt verveelt kan eens proberen te zien wat er anders is:P

Code:
void decode(int len){
	// decode it!
	int f = 0,g = -1, cd1,cd2,cd3,cd4,brute,t,k = long(strlen(aesc.hash));
	bool gotit = false;
	printf("This is long: %d",k);
	for(long j = len;j < long(k - 1);j++){
		f++;
		g++;
		if(f > 255) { f = f - 256; printf("%d / %d\n",j,k); }
		cd1 = int(aesc.hash[j]); if(cd1 < 1){cd1 = cd1 + 256;}
		if(cd1 == aesc.decodevalue) {
			cd3 = int(aesc.hash[j+1]); if(cd3 < 1){cd3 = cd3 + 256;}
			cd4 = int(aesc.hash[j+2]); if(cd4 < 1){cd4 = cd4 + 256;}
			// Two possibilities
			if(cd3 == 234 && cd4 == 243){ 
				j = j + 2; 
				cd2 = cd1 - f;
			} else {
				cd2 = cd3 + 255 - f;
				j = j + 1;
			}
		} else{
			cd2 = cd1 - f;
		}
		// Starting classic decodement
		brute = 1;
		gotit = false;
		
		// Rewriting for faster decodement... never mind

		do{
			t = 200 - brute - aesc.decodevalue;
			while (t<1) {
				t = t + 255;
			}
			while (t > 255) {
				t = t - 255;
			}
			if(t == cd2){
				buffer[g] = char(brute);
				gotit = true;
			}
			brute++;
			if(brute > 256){ printf("*****ERROR*****"); exit(1); }

		} while ((gotit == false));

	}
	// Entire decodement is now complete..
	aesc.decsize = g - 1;
	aesc.result = new char [aesc.orgsize];
	strncpy(aesc.result,buffer,aesc.orgsize);
}

Persoonlijk zou ik gokken op mijn k die de lengte vastlegt. Anders moest hij de elke keer herberekenen denk ik:) En het percentage werkte niet eens correct:P maar dit is veel cooler:D

Anyway wie de moeite deed om dit te lezen, bedankt:) en een ongegeneerd applausje voor mezelf lol
 
Laatst bewerkt door een moderator:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan