Registrierung Kalender Mitgliederliste Teammitglieder Suche Häufig gestellte Fragen Zur Startseite

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C - Programm zu langsam » Antwort erstellen » Hallo Gast [Anmelden|Registrieren]

Antwort erstellen
Benutzername: (du bist nicht eingeloggt!)
Thema:
Nachricht:

HTML ist nicht erlaubt
BBCode ist erlaubt
Smilies sind erlaubt
Bilder sind erlaubt

Smilies: 21 von 33
smileWinkDaumen hoch
verwirrtAugenzwinkerngeschockt
Mit ZungeGottunglücklich
Forum Kloppebösegroßes Grinsen
TanzentraurigProst
TeufelSpamWillkommen
LehrerLOL HammerZunge raus
Hilfe 
aktuellen Tag schließen
alle Tags schließen
fettgedruckter Textkursiver Textunterstrichener Text zentrierter Text Hyperlink einfügenE-Mail-Adresse einfügenBild einfügen Zitat einfügenListe erstellen CODE einfügenPHP CODE farbig hervorheben
Spamschutz:
Text aus Bild eingeben
Spamschutz

Die letzten 2 Beiträge
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! ^^
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