Beruflich Dokumente
Kultur Dokumente
Performanceverbesserung
Agenda
Schritte zur Performance-Verbesserung: Herausheben von Schleifeninvarianten Caching / Memoziation Binre Suche Memory Mapping der passwd Datei Direct Memory Access (DMA) Adressberechnungen vermeiden Schreibeoperationen vermeiden
Resultierendes Programm Performancevergleich
Ursprnglich
char *uid2name (int uid) { ... File *passwd = fopen(...); ... } int main () { ... while (...) { uid2name (...); } }
Verbessert
File *passwd;
char *uid2name (int uid) { ... } int main () { ... passwd = fopen (...); while (...) { uid2name (...); }
fclose (passwd);
Caching / Memoziation
Problem:
Ursprnglich
passwd Datei wurde bei jedem Aufruf von uid2name mittels I/OOperationen durchsucht
Caching / Memoziation
Binre Suche
Problem: Lineare Suche in interner Datenstruktur (unsortiertes Array) ist sehr aufwndig.
Nachteile
Sortierung der Datenstruktur notwendig (hoher Sortieraufwand). In unserem Fall war dies zwar nicht notwendig, konnten aber durch die Rechenoperationen (/2, etc.) nicht viel Rechenzeit gewinnen. Weiters knnen nicht richtig einsortierte Elemente die gesamte Suche als ganzes in vielen Fllen zunichte machen.
Direct Memory-Access
Problem:
Iterativer Suchaufwand von O(n2) Iterative Suche durch (direkten) Speicherzugriff ersetzen
Ursprnglich
linearer Suchaufwand zum Durchsuchen der gecachten Daten (Tuppel aus UID und Benutzername)
Verbessert
Sttzung von Modulo-Algebra Einordnung der gecachten Daten in Equivalenzklassen (KongruenzKlassen) Lineare Suche innerhalb dieser Klassen 3K Klassen ~ DMA
Adressberechnungen vermeiden
Problem: Da wir die passwd Datei in einer internen Datenstruktur (Array) verwalten, bentigen wir direkten Zugriff auf einzelne Arrayelemente.
Ursprnglich
parsen der passwd Datei: Innerhalb einer while Schleife (siehe spter) wird auf Elemente des Arrays mittels Index zugegriffen:
entry[index].name = lname
Verbessert
Mittels Pointer auf die Datenstruktur (Array) zugreifen:
entry_ptr->name = lname
Spart Prozessor die Adressberechnung in jedem Schleifendurchgang. Anmerkung: Diese Optimierung knnen die meisten Compiler von selbst.
Schreibeoperationen vermeiden
Problem: Schreibeoperationen im Speicher sind sehr zeitaufwndig.
strtok durch strchr und strncpy ersetzen Ursprnglich
strtok wurde zum parsen der passwd Datei verwendet:
char *lname = strtok(line, ":");
Verbessert
1. strchr zur Positionierung im Speicher verwenden
searchstr = strchr(data, ':');
Schreibeoperationen vermeiden
strcpy/strncpy
char tmp[STR_SIZE] = {""}; char tmp2[STR_SIZE] = {""}; len = strchr(map, ':') - map; //UName finden strncpy(tmp2, map, len); //UName herauskopieren map += len + 1; //:x: berspringen map = strchr(map, ':') + 1; //:x: berspringen len = strchr(map, ':') - map; //UID finden strncpy(tmp, map, len); //UID herauskopieren fach = atoi(tmp); //UID konvertieren strcpy(filecn[fach], tmp2); //in HashTable speichern
Unsere Lsung