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

Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C - Programm zu langsam » Hallo Gast [Anmelden|Registrieren]
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen
Neues Thema erstellen Antwort erstellen
Zum Ende der Seite springen C - Programm zu langsam
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
LightSideOfLife
Mitglied


Dabei seit: 24.11.2015
Beiträge: 27

C - Programm zu langsam Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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
28.06.2016 20:23 LightSideOfLife ist offline Beiträge von LightSideOfLife suchen Nehmen Sie LightSideOfLife in Ihre Freundesliste auf
Necip
Grünschnabel


Dabei seit: 01.07.2016
Beiträge: 2

RE: C - Programm zu langsam Auf diesen Beitrag antworten Zitatantwort auf diesen Beitrag erstellen Diesen Beitrag editieren/löschen Diesen Beitrag einem Moderator melden       Zum Anfang der Seite springen

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! ^^
01.07.2016 08:43 Necip ist offline Beiträge von Necip suchen Nehmen Sie Necip in Ihre Freundesliste auf
Baumstruktur | Brettstruktur
Gehe zu:
Neues Thema erstellen Antwort erstellen
Informatiker Board » Themengebiete » Praktische Informatik » Softwaretechnik » C - Programm zu langsam