C - Programm zu langsam

Neue Frage »

Auf diesen Beitrag antworten »
LightSideOfLife C - Programm zu langsam

Guten Abend!

Ich soll für mein Praktikum ein Programm programmieren, das eine sehr große Textdatei in einem Buffer speichert und dann Zeilenumbrüche und bestimmte Buchstaben löschen soll.
Benutzen sollen wir dafür die Funktion fread, strcspn und memmove, da eine Laufzeit von unter einer Minute erreicht werden muss.

Mein derzeitiger Code sieht so aus:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


struct bufferstuff
{
	char* buffer_s;
	long laenge_s;
};

void* rmove(void* val)
{
	/*CASTEN VON VOID IN STRUCT BUFFERSTUFF*/
	
	struct bufferstuff* bufferstruct = (struct bufferstuff*) val;
	
	char* buffer;
	long laenge;
	size_t n;
	
	/*BUFFER AUS BUFFERSTRUCT AN BUFFER ZUR BEARBEITUNG ÜBERGEBEN*/ 
	
	buffer = bufferstruct->buffer_s;
	
	laenge = strlen(buffer);
	
	/*i UM SCHLEIFENDURCHGÄNGE ZU ZÄHLEN - UM ZU WISSEN WO ARRAY ZU ENDEN HAT: '\0'*/
	
	int i = 0;

	/*WHILE SCHLEIFE SUCHT ERSTES VORKOMMEN VON c,g,t,a oder N UND ARBEIET SO LANGE BIS SIE AM ENDE DES ARRAYS ANKOMMT*/
	
	while((n = strcspn(buffer,"cgtaN")) != laenge-i)
	{
		if(n >= laenge-i) /*return FALLS ENDE DES ARRAYS ERREICHT IST, ANSONSTEN SEGFAULT*/
			return (void*)buffer;
		memmove(&buffer[n], &buffer[n+1], laenge-n-1 ); /*MEMMOVE SCHIEBT ARRAY NACH VORNE*/
		i++; /*ZÄHLT SCHLEIFENDURCHGÄNGE*/
	}
	
	return (void*)buffer;
}

struct bufferstuff* buffercreate(FILE* datei)
{
	
	/*FUNKTION UM DATEI IN BUFFER ZU SPEICHERN*/
	
	char* buffer;
	long laenge;
	size_t ergebnis;
	long anzahl;

	fseek(datei, 0, SEEK_END);
	laenge = ftell(datei);
	rewind(datei);
	
	buffer = (char*)malloc(sizeof(char)* laenge);
	if (buffer == NULL){printf("ERROR"); exit(2);}
	
	ergebnis = fread(buffer, 1, laenge, datei);
	if (ergebnis != laenge) {printf("Error"); exit(3);} 
	
	fclose(datei);
	
	/*STRUCT ALLOC UM ES AN DIE VOID FUNKTION ZU ÜBERGEBEN/ GGF. MAL MIT THREADS ARBEITEN*/
	
	struct bufferstuff* bufferstruct = (struct bufferstuff*)malloc(sizeof(bufferstruct));
	
	bufferstruct->buffer_s = buffer;
	bufferstruct->laenge_s = laenge;
	
	/*AUSFÜHREN DER REMOVE FUNKTION/ STRUCT IN VOID GECASTET*/
	
	buffer = (char*)rmove((void*)bufferstruct);
	
	/*NEUEN BEARBEITETEN BUFFER IN STRUCT SPEICHERN UM STRUCT ZU RETURNEN*/
	
	bufferstruct->buffer_s = buffer;
	
	return bufferstruct;
}

main(int argc, char* argv[])
{	
	FILE* datei;

	struct bufferstuff* bufferstruct = (struct bufferstuff*)malloc(sizeof(bufferstruct));
	
	datei = fopen((argv[1]), "r");
	
	bufferstruct = buffercreate(datei);
	
	/*BUFFERSTRUCT BEINHALTET NUN BEARBEITETEN BUFFER*/
	
	char* buffer;
	
	/*IN BUFFER SPEICHERN UM GGF. AUSZUGEBEN*/
	ogramm
	buffer = bufferstruct->buffer_s;
	
	printf("%s", buffer);
	

}


Bei kleinen Textdateien ist das ganze sehr schnell und effizient.
Bei den großen Dateien mit denen wir arbeiten sollen (Chromosome) dauert die rmove Funktion jedoch ewig!
Hat einer ein Idee weshalb mein Programm so langsam ist?
Der Tutor sagte, dass Threads bei diesem Programm noch nicht einmal von Nöten sind. Muss auch zugeben dass ich mit denen noch nicht gut umgehen kann.
Für Hilfe wäre ich sehr dankbar!

Liebe Grüße,
Marvin
 
Auf diesen Beitrag antworten »
Necip RE: C - Programm zu langsam

Die Funktion "memmove" ist der Flaschenhals, der deine Anwendung abbremst. Ich würde den Pufferinhalt nicht verschieben, sondern mit Indizes arbeiten.

Threads sind nicht so kompliziert, wie man denkt. Es gibt genügend Beispiele im Netz. Sie nützen leidlich wenig in der Performanz, wenn man nur einen Prozessor hat.

happy coding! ^^
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »