• Like
Effiziente Programme
Upcoming SlideShare
Loading in...5
×

Effiziente Programme

  • 43 views
Uploaded on

Wie kann ich Programme effizienter gestalten? Kleine Intro

Wie kann ich Programme effizienter gestalten? Kleine Intro

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
43
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Effiziente Programme Performanceverbesserung Erhard Dinhobl Margit Weber Martin Reiterer Stefan Reiterer
  • 2. AgendaSchritte zur Performance-Verbesserung: • Herausheben von Schleifeninvarianten • Caching / Memoziation • Binäre Suche • Memory Mapping der passwd Datei • Direct Memory Access (DMA) • Adressberechnungen vermeiden • Schreibeoperationen vermeidenResultierendes ProgrammPerformancevergleich
  • 3. Herausheben von SchleifeninvariantenProblem: Dateien öffnen im Normalfall sehr aufwändig! Datei nicht in jedem Schleifendurchgang neu öffnenUrsprünglich Verbessertchar *uid2name (int uid) { File *passwd; ... File *passwd = fopen(...); char *uid2name (int uid) { ... ...} } int main () {int main () { ... ... passwd = fopen (...); while (...) { while (...) { uid2name (...); uid2name (...); } }} fclose (passwd); }
  • 4. Herausheben von Schleifeninvarianten
  • 5. Caching / MemoziationProblem: I/O-Operationen sehr aufwändig! Datei bei ersten Aufruf von uid2name parsen und in Prozessspeicher chachenUrsprünglich Verbessertpasswd Datei wurde bei jedem Aufruf Beim 1. Aufruf:von uid2name mittels I/O- passwd Datei komplett einlesen,Operationen durchsucht notwendige Informationen intern cachen und Datei wieder schließen Ab 2. Aufruf: Ergebnis aus Cache (Liste, Array) zurückliefern.
  • 6. Caching / Memoziation
  • 7. Binäre SucheProblem: Lineare Suche in interner Datenstruktur (unsortiertesArray) ist sehr aufwändig.Lösungsvorschlag: Binäre Suche in interner Datenstruktur.Vorteil Nachteile • Sortierung der Datenstruktur • Geringerer Suchaufwand, im notwendig (hoher Sortieraufwand). In Vergleich zu linearer Suche. unserem Fall war dies zwar nicht • Da passwd Datei "fast" sortiert notwendig, konnten aber durch die ist, muss interne Datenstruktur Rechenoperationen (/2, etc.) nicht viel nicht sortiert werden. Rechenzeit gewinnen. Weiters können nicht richtig einsortierte Lineare Suche für "Ausreißer" Elemente die gesamte Suche als ganzes in vielen Fällen zunichte machen.
  • 8. Öffnen der Datei - mmapBisherige Version Verbessertfopen() open()pro Zeile getline() (char *) mmap() mmap() liefert Pointer auf char im Speicher, pro Zeile auslesen fällt weg.
  • 9. Speicher von mmap() verwenden (while-body)len = map; //aktuelle Pos. im Speicherwhile(*len != :) len++; //bis zum ersten : in Zeile gehenold = map; //aktuelle Pos. speichernmap = len + 1; //im Speicher bis nach : weitergehenmap += 2; //:x: überspringenlen = map; //aktuelle Pos. nach :x: setzenwhile(*len != :) len++; //weiter bis nächsten :fach = atoi(map); //nach :x: ist UIDmap = len + 1; //nach UID positionierenfilecn[fach] = old; //old zeigt auf UName
  • 10. Speicher von mmap() verwenden II- Trotz Speicherverwendung sehr landsam: ~3.1 MioIterationen- Speicher von char-Pointern ebenfalls Verwalten- Gesamte Datei im Speicher (!!)mit strcpy realisieren, genauso langsam/schnell
  • 11. Direct Memory-AccessProblem: Iterativer Suchaufwand von O(n2)   Iterative Suche durch (direkten) Speicherzugriff ersetzenUrsprünglich Verbessert    • Stützung von Modulo-Algebralinearer Suchaufwand zum  • Einordnung der gecachten Daten Durchsuchen der gecachten Daten  in Equivalenzklassen (Kongruenz-(Tuppel aus UID und Benutzername) Klassen) • Lineare Suche innerhalb dieser  Klassen • 3K Klassen ~ DMA
  • 12. mmap - Direct Memory-Access
  • 13. Adressberechnungen vermeidenProblem: Da wir die passwd Datei in einer internen Datenstruktur (Array) verwalten, benötigen wir direkten Zugriff auf einzelne Arrayelemente.Ursprünglich Verbessert   parsen der passwd Datei: Innerhalb   Mittels Pointer auf die Datenstruktur einer while Schleife (siehe später)  (Array) zugreifen: entry_ptr->name = lnamewird auf Elemente des Arrays mittels Index zugegriffen:   Spart Prozessor die entry[index].name = lname Adressberechnung in jedem  Schleifendurchgang.   Anmerkung: Diese Optimierung  können die meisten Compiler von  selbst.
  • 14. Schreibeoperationen vermeidenProblem: Schreibeoperationen im Speicher sind sehr zeitaufwändig.                 strtok durch strchr und strncpy ersetzen Ursprünglich Verbessert     strtok wurde zum parsen der passwd  1. strchr zur Positionierung im  Datei verwendet: Speicher verwenden searchstr = strchr(data, :);   • strncpy zum Lesen von n  char *lname = strtok(line, ":"); Zeichen im Speicher verwende   strncpy(entry_ptr->name, data, strtok schreibt 0 in den Speicher searchstr - data);
  • 15. Schreibeoperationen vermeiden
  • 16. 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
  • 17. Gegenüberstellung der Optimierungen Zyklen
  • 18. Gegenüberstellung der Optimierungen Speicher
  • 19. Unsere Lösung Caching / Memoziation der passwd Einträge Direkter Zugriff auf interne Datenstruktur (Pointer auf einfach verkettete Listen) Vermeidung von Schreibzugriffen auf den Speicher Verwendung eines Pools von Strukturelementen, anstatt malloc für jedes neue Strukturelement. (Listenerstellung) Nur Pointeroperation zum Parsen der passwd Datei