» Willkommen auf Software «

poschy
aus die Maus :D
offline



Real OC or Post God !
19 Jahre dabei !

Intel Core i7


Hey, denke das ist das richtige Unter-Forum :thumb:
Hab ein Programm zur Primzahlzerlegung geschrieben. Das würd ich gern so optimal wie möglich machen :thumb:

Welche Dinge sind schneller?

Globale / Lokale Variablen ?

schleifen oder rekursion ?

funktionsprototypen + funktionen unter der main? oder ohne prototypen?

verkettete liste oder array?


42

Beiträge gesamt: 10048 | Durchschnitt: 1 Postings pro Tag
Registrierung: Okt. 2004 | Dabei seit: 7299 Tagen | Erstellt: 18:29 am 14. April 2010
BDKMPSS
offline


OC God
22 Jahre dabei !


Ich denke du nimmst mir das nicht übel wenn ich sage, dass dies der völlig falsche "Optimierungs" Ansatz ist.

Als erste, wichtigste und oft auch als einzige sinnvolle Optimierung ist der Algorithmus als solcher zu überdenken. Wenn du einen schlechten Algorithmus noch so hochoptimiert implementierst ist so gut wie immer langsamer als ein schlecht implementierter guter Algorithmus.

Generell kann man aber trotzdem auch zu deinen Vergleichen Aussagen treffen. Für genauere Erklärungen ist das hier aber wohl nicht der richtige Ort und würde auch etwas zu lang werden.
_____

In C hängt nehmen sich globale und lokale Variablen grundsätzlich erst ein mal nichts. In abstrakteren Programmiersprachen sind globale Variablen langsamer, da erst versucht wird sie lokal aufzulösen (zu finden) und dann global. Die globale Auflösung ist oft auch langsamer.
In C gilt das aber nicht, da der Compiler beides meistens gleich umsetzt und die Variable in dem Sinne nicht aufgelöst werden muss.
Was im konkreten Fall schneller ist, hängt von der Nutzung ab.
Wenn du eine Funktion sehr oft aufrufst und diese jedes mal eine neue Variable initialisiert, ist das langsamer als die alte Variable einfach zu überschreiben. Dazu hat man in C 2 Möglichkeiten. Eine globale Variable oder eine lokale "static" variable.
Nicht wirklich sinnvolles Pseudo-Code Beispiel:
for(int i = 0; i< 1000000; i++) {
   a();
}

a() {
 int b;
 b = 99;
}

ist langsamer als:
a() {
 static int b;
 b = 99;
}
was sich wiederum (meistens) genau so verhält wie:
static int b;
a() {
 b = 99;
}

Wenn du Parameter übergibt ist dies langsamer als nichts zu übergeben. Aber viele globale Variablen zu verwenden ist (eigentlich immer) schlechter programmier Stil und bringt wenig bis nichts.
_____

Eine iterative Lösung gegen eine rekursive Lösung ist meist schwer abzuschätzen. Die Rekursion verbraucht eigentlich immer mehr Speicher, kann aber auch trotzdem schneller als so manche iterative Lösung sein.
Hängt stark vom Problem ab.
Wenn du etwas endrekursiv umsetzten kannst hast du mit modernen Compilern fast das gleiche Ergebnis wie mit einer iterativen Lösung (was Speicher und Geschwindigkeit angeht).
Eine *perfekte* Iteration sollte exakt das gleiche Ergebnis wie eine *perfekte* Endrekursion liefern.
_____

Prototypen gehören zu allen "public" (also in C allen nicht "static") Funktionen und natürlich immer ins header file, welches vor der Main Methode zu inkludieren ist.
"private" (also "static" Funktionen in C) vor der Main und den ersten Aufruf der Funktion schreiben, dann keinen Prototyp schreiben.
Ob du die Funktions-Implementierung vor oder nach der Main Funktion oder in eine andere Datei schreibst macht überhaupt nichts aus, da der Compiler und Linker das eh zusammen wirft. Das Ergebnis ist in jedem Fall gleich (und gleich schnell).
_____

Eine verkettete Liste ist in jeder Sprache stets langsamer als ein Array, außer in Sprachen gibt, bei der das Array nur eine verkettete Liste ist.
Es kann aber schneller sein die Liste zu erweitern als ständig ein neues Array anzulegen und umzukopieren. Deshalb hat man die Liste erfunden.
_____

Ich würde es immer vorziehen Alles in einem ordentlichen Stil umzusetzen, selbst wenn es ein wenig langsamer ist. Oft optimiert der Compiler es so weit, das das gleiche bei raus kommt, aber das Programm ist einfach wartbarer und *schöner*. Selbst wenn nicht ist die "Verbesserung" für das angesprochene nie mehr als im einstelligen Prozent Bereich.
Wenn du es wirklich schnell und ohne overhead haben willst schreibe es in Assembler. Wenn du das ein paar mal gemacht hast ist das auch nicht so extrem schwer und außerdem mach sich das immer gut auf einer Bewerbung.
Das wichtigste ist und bleibt aber der Algorithmus, der mal schnell eine Optimierung von mehreren tausend Prozent bringen kann.

Viel Spaß weiterhin ;)

(Geändert von BDKMPSS um 19:28 am April 14, 2010)

Beiträge gesamt: 1860 | Durchschnitt: 0 Postings pro Tag
Registrierung: Feb. 2002 | Dabei seit: 8285 Tagen | Erstellt: 19:01 am 14. April 2010
poschy
aus die Maus :D
offline



Real OC or Post God !
19 Jahre dabei !

Intel Core i7


danke schonmal für die antwort :thumb:

also wir reden hier von c-basics.. assembler kann ich zwar ein paar dinge, ist jedoch vom prof nicht gewünscht ;)

diese ganze optimierungssache ist für mich sowieso käse.. das programm soll unter 2 sekunden laufen, was aber doch auch abhäning vom pc selber ist..

ich hab schon größtenteils überall schleifen verkürzt.. (wenns möglich war). Weiss nicht wie ich sonst noch was optimieren könnte.. deswegen kam ich überhaupt erst auf diese ideen :thumb:


42

Beiträge gesamt: 10048 | Durchschnitt: 1 Postings pro Tag
Registrierung: Okt. 2004 | Dabei seit: 7299 Tagen | Erstellt: 19:26 am 14. April 2010
BDKMPSS
offline


OC God
22 Jahre dabei !


Dann schreibst du eine handvoll Zeilen in einer sehr abstrakten Sprache (Setl, Lisp/Prolog) , mietest dir für ein paar Minuten eine PowerPC Node in einem Rechenzentrum und hast den Prof verblüfft oder verärgert :lol:

Lager es in so viele Threads aus wie du Kerne im Recher hast und dann geht es gleich um einiges schneller. Bei einer Primzerlegung ist das auch relativ einfach aufzuteilen.

(Geändert von BDKMPSS um 19:38 am April 14, 2010)

Beiträge gesamt: 1860 | Durchschnitt: 0 Postings pro Tag
Registrierung: Feb. 2002 | Dabei seit: 8285 Tagen | Erstellt: 19:32 am 14. April 2010
gabiza7
offline



OC Profi
14 Jahre dabei !

AMD Athlon II
2700 MHz @ 3700 MHz
46°C mit 1.475 Volt


Auch, wenn das jetzt OT ist.
Was studierst'n du? Ist das schon Informatik oder Mathe oder so, wo du programmieren musst?

Wenn Informatik, kann man das können? Programmiere ja auch, aber nur ein bisschen, aber ich zweifle irgendwie noch an mir, ob das reicht für ein Informatikstudium.
Momentan hab ich sehr wenig Zeit, dass ich mich richtig mit Programmierung beschäftige (Abschlussjahr), daher kann ich nur das Nötigste und das auch nur in Delphi, so Variablen deklarieren natürlich, Datentypen umwandeln und Arrays, naja und durch mein Fachreferat ein bisschen Tabellen und so aber das alles nur in Delphi.
Ist C schwerer? Wie sieht's mit Assembeln aus, kann man das lernen? (In der TR-Szene gibt's ja Assembler, die die "tomb4.exe" mit ollidbg auseinandernehmen und verändern, ich durfte da auch mal reingucken, aber wenn ich ehrlich bin, verstehe ich davon nichts)

Bin dann auch eher praktisch veranlagt, also mir macht PCs bauen und übertakten und so, viel Spaß, aber im Studium kommt das ja wahrscheinlich nicht dran, PC-Hardware-Kenntnisse werden wahrscheinlich vorrausgesetzt und Übertakten ist ja jetzt mal so böse gesagt "nur was für Spinner" (also ist nicht meine Meinung, aber vermutlich die Meinung der ganzen Programmierer und so)

(Geändert von gabiza7 um 19:41 am April 14, 2010)

Beiträge gesamt: 933 | Durchschnitt: 0 Postings pro Tag
Registrierung: Feb. 2010 | Dabei seit: 5361 Tagen | Erstellt: 19:40 am 14. April 2010
poschy
aus die Maus :D
offline



Real OC or Post God !
19 Jahre dabei !

Intel Core i7


ich studiere wirtschaftsingenieurwesen elektrotechnik :thumb:

am besten gehst du einfach mal in deine wunsch uni/fh.. dort kann man sich sowas mal probeweise anschauen, wird rumgeführt usw :)

wie mache ich sowas denn?
einfach mehrere funktionen? wie weise ich den einzelnen kernen funktionen zu?:noidea:


42

Beiträge gesamt: 10048 | Durchschnitt: 1 Postings pro Tag
Registrierung: Okt. 2004 | Dabei seit: 7299 Tagen | Erstellt: 20:25 am 14. April 2010
BDKMPSS
offline


OC God
22 Jahre dabei !


Grob gesagt kann man eine Schleife folgendermaßen aufteilen:

Vorher:
for (int i = 0; i < 1000000; i++) {
  a();
}

nachher:
startThread(run(), 0, 499999);
startThread(run(), 500000, 1000000);

run(c, b) {
  for (int i = c; i < b; i++) {
     a();
  }
}

Die Threads werden dann von dem OS automatisch verteilt. Du solltest nur nicht mehr stark rechnende Threads erstellen als du Kerne hast, weil es sonst wieder langsamer wird.

Mit der Suchmaschine deiner Wahl findest du bestimmt schnell was passendes für die Plattform auf der das laufen soll.
Man muss im Prinzip ein header file einbinden und eine Funktion aufrufen, die dann "magic" macht. Etwas Verwaltung ist das aber schon.
Wenn du aber nicht unbedingt 2h in das verstehen rein stecken willst, dann musst das nicht machen :thumb:

(Geändert von BDKMPSS um 20:49 am April 14, 2010)

Beiträge gesamt: 1860 | Durchschnitt: 0 Postings pro Tag
Registrierung: Feb. 2002 | Dabei seit: 8285 Tagen | Erstellt: 20:45 am 14. April 2010
poschy
aus die Maus :D
offline



Real OC or Post God !
19 Jahre dabei !

Intel Core i7


hab ja noch bis juli zeit, das werd ich auf jedenfall machen.. danke :thumb:


42

Beiträge gesamt: 10048 | Durchschnitt: 1 Postings pro Tag
Registrierung: Okt. 2004 | Dabei seit: 7299 Tagen | Erstellt: 20:58 am 14. April 2010
VoooDooo
aus München
offline



Real OC or Post God !
22 Jahre dabei !

Intel Core 2 Quad
2400 MHz @ 3500 MHz
55°C mit 1.360 Volt


@gabiza7: das ganze Programmieren lernst du im Studium, du brauchst theoretisch gar kein Vorwissen. Ich hatte auch so gut wie keine Ahnung vom Programmieren vorher. Ging mit C los, dann C++ und später Java, zwischendurch bisschen Assembler. Gibt genug Übungsstunden und man kann ja nebenher selber bisschen programmieren und vertiefen. War Informatikstudium an ner Fachhochschule.

Mit Hardware an sich hat das Studium eigentlich gar nichts zu tun. Klar lernst du die ganzen Zusammenhänge (CPU, Speicher...) und wie alles miteinander arbeitet, aber das ist ziemlich Theoretisch.

Beiträge gesamt: 10181 | Durchschnitt: 1 Postings pro Tag
Registrierung: Jan. 2002 | Dabei seit: 8328 Tagen | Erstellt: 21:17 am 14. April 2010
gabiza7
offline



OC Profi
14 Jahre dabei !

AMD Athlon II
2700 MHz @ 3700 MHz
46°C mit 1.475 Volt


Danke, VoooDooo für deine aufschlussreiche Antwort.:)

Dann bin ich mal beruhigt, wenn man im Studium programmieren lernt, aber wie ist es mit dem Verstehen und Mitkommen?
Also in der Schule komm ich im Informatikunterricht sehr gut mit, was würdest du sagen, ist auf der FH wahrscheinlich schon schwerer zu verstehen, oder? Oder hattest du in der Schule kein Informatik und hast daher auch keinen Vergleich?

Am Idealisten für mich wäre es ja, wenn ich mein Interesse für PCs und Programmieren sowie Schreiben verbinden könnte, also praktisch mal später vll zu Com! oder so gehen, weil mir das schon Spaß macht z.B. Hardware zu testen und dann darüber zu schreiben (hab bisher noch nicht soviel getestet, bin aber dabei und demnächst wird auch meine Webpage online gehen) sowie hin und wieder auch was zu programmieren. Hab aber keine Ahnung, ob man dazu Info studiert haben muss oder eher was mit Journalistik oder ob es dafür einen kombinierten Studiengang gibt.

(Geändert von gabiza7 um 18:03 am April 15, 2010)

Beiträge gesamt: 933 | Durchschnitt: 0 Postings pro Tag
Registrierung: Feb. 2010 | Dabei seit: 5361 Tagen | Erstellt: 18:02 am 15. April 2010