Programmieren - Geschwindigkeit

Hallo,
ich hätte mal ne technische Frage.
Beim Programmieren höre ich ständig Leute, die sich endlos darüber unterhalten, wie viel Zeit verloren geht, wenn sie neue Variablen deklarieren oder Methodenaufrufe machen usw.
Da aber niemand weiß, wie „lange“ das wirklich dauert, dachte ich, vielleicht hat irgendein technischer Informatiker hier irgendwo ne Zahl…

Klar, das hängt immer von Sprache und Rechner ab, aber ich hätte gerne ein paar Vergleichswerte von etwa Public Variablen lesen zu über getter() lesen.
Oder vielleicht das initialisieren/alloziieren und zuweisen im Vergleich zu Gettermethoden usw.
Naja, ich hoffe, ihr versteht, was ich meine.
Vielleicht hat da irgendwer was mal drüber gelesen.
Vielen Dank,
Tobias

Hallo!
Wer sich heutzutage noch Gedanken darüber macht, ob die bessere Kapselung über Getter/Setter eine Auswirkung auf die Ausführungsgeschwindigkeit hat, ist m.M. nach nicht up-to-date.

Wenn man aus logischen Gründen Getter/Setter braucht (um bspw. Konsistenzprüfungen durchzuführen), erübrigt sich die Frage eh’.
Da Compiler in aller Regel ohnehin optimieren und dabei auch reine Getter/Setter ohne Zusatzfunktion auf Maschinencodeebene/IL-Ebene durch direkte Zugriffe ersetzt (etwas vereinfacht ausgedrückt), spielt es wirklich keine Rolle.

Gruß,
Martin

Meiner Meinung nach kommt es darauf an, was man machen möchte.

Aus Erfahrung kann ich sagen, dass bei Verarbeitung von größeren Datenmengen und / oder Algorithmen es auf jedes ‚Byte‘ ankommt. Hier kann man sehr schnell einen Server oder eine Software zum erliegen bringen, trotz moderner Hardware. Den Fehler dann zu finden, kann eine Torture werden.

Also, bei kleinen Aktionen ist das vollkommen egal, ‚wie‘ man programmiert, aber bei großen Sachen sich immer angucken und überlegen, was man macht.

Im Übrigen sind Getter und Setter Methoden Standard bei globalen Variablen und sollten daher immer verwendet werden (java, vb).

Danke für die schnellen Antworten. Klar ist natürlich bei einem kleinen Desktopprogramm der Performancegewinn nicht merkbar. Und natürlich ist mir auch bewusst, dass die unterschiedlichen Programmierweisen verschiedene programmanforderungen haben.
Dennoch erlebe ich trotzdem noch (gerade bei z.B. Spielen für Smartphones oder großen Algorithmen) wie beschrieben Leistungsbedarf.
Letztlich hätte mich aber einfach die tatsächliche Leistung interessiert, da ich schon damals im Studium darauf aufmerksam gemacht wurde, dass i++ langsamer sei als ++i. Von Methodenaufrufen ganz zu schweifen.Bislang konnte mir noch niemand die Leistungsunterschiede zeigen.
Ich hatte einfach gedacht, irgendwer hier hätte davon mal was gehört.
Danke trotzdem für eure Hilfe,
Tobias

Hallo Tobias,

Letztlich hätte mich aber einfach die tatsächliche Leistung
interessiert, da ich schon damals im Studium darauf aufmerksam
gemacht wurde, dass i++ langsamer sei als ++i.

Das hängt auch sehr von der verwendeten CPU und dem Compiler ab.

  1. Es gibt CPUs welche laden und inc-/decementieren in einem Befehl können.

  2. Optimierende Compiler können, wenn das Resultat nicht verwendet wird ++i oder i++ selbständig in die schnellere Variante umstellen.

MfG Peter(TOO)

Hallo Tobias,

solche „Kleinigkeiten“ sind bei den heutigen Bedingungen eher unwichtig. Die Komplexitätsklasse der verwendeten Algorithmen und eventuell die verwendeten Datentypen fallen da sehr viel mehr ins Gewicht.

Wir Too schon meinte, übernehmen die Compiler oft schon die Optimierung solcher Kleinigkeiten. Bei schlecht ausgewählten Algorithmen oder Datentypen sind diese jedoch machtlos.

Gruss
Petra

Ich bin der Meinung, dass solche Infos eher für die Hardwareprogrammierer interessant sein dürfte. Gerade im Automotive- oder Echtzeit-Bereich. Hier kommt es ja auf jede Millisekunde an.

Smartphones dürfte das ++i oder i++ eher weniger tangieren, wobei möglicherweise der Compiler, wie bereits erwähnt, die Aufgabe übernimmt.

Hallo Fragewurm,

Es kommt wie immer auf die Bedingungen an.

Bei der „Hardwareprogrammierung“ sind vor allem die Kosten des Produkts wichtig. Wenn ich da mit einem günstigeren langsameren Prozessor zurechtkomme steigt der Gewinn.

Bei einem Smartphone kann man auch mehr oder weniger flüssig arbeiten, je ach dem ob die Datenstrukturen und Algorithmen optimiert sind. Wobei das Optimieren nur bei Algorithmen rentiert welche auch einen wesentlichen Beitrag zur Laufzeit beitragen.
Und bei einem extremen Projekt wie z.B. Seti@Home machen ein paar Millisekunden bei einem einzelnen Berechnungsvorgang viel aus, die Ladezeiten für die Daten sind dafür nebensächlich.

Grundsätzlich geht es immer nur um die Kosten, entweder diejenigen welche bei der Programmierung oder entstehen oder jene bei der Anwendung.

MfG Peter(TOO)

Und bei einem extremen Projekt wie z.B. Seti@Home machen ein
paar Millisekunden bei einem einzelnen Berechnungsvorgang viel
aus, die Ladezeiten für die Daten sind dafür nebensächlich.

Tja, da haben wir doch noch ein Beispiel. Aber dass ein guter Algorithmus wichtig ist, steht natürlich auch außer Frage.
Wie gesagt, es war vielmehr von allgemeinem Interesse. Abgesehen davon kann ich mir nicht ganz vorstellen, dass der Compiler schon bei grundsätzlichen Methoden unterschiede macht. Schließlich ist ++i und i++ ja ein Unterschied. Oder getter-Methoden anders als public Variablen. Also kann ich mir irgendwie nicht vorstellen, dass der das immer so „optimieren“ sollte. Gerade beim Zugriffsschutz.
Aber klar, vermutlich geht da ziemlich viel in der Blackbox ab, was man als Programmierer gar nicht so mitbekommt…
Danke für eure vielen Beiträge,
Tobias

Hallo Tobias,

Abgesehen davon kann ich mir nicht ganz vorstellen, dass der
Compiler schon bei grundsätzlichen Methoden unterschiede
macht. Schließlich ist ++i und i++ ja ein Unterschied. Oder
getter-Methoden anders als public Variablen. Also kann ich mir
irgendwie nicht vorstellen, dass der das immer so „optimieren“
sollte. Gerade beim Zugriffsschutz.
Aber klar, vermutlich geht da ziemlich viel in der Blackbox
ab, was man als Programmierer gar nicht so mitbekommt…

Man sieht es, wenn man sich den vom Compiler erzeugten Assemblercode ansieht :wink:

Ich habe in den 90er Entwicklungstools für neue Microcontroller entwickelt(Prtotyping-Boards und Monitore für Sourcelevel-Debugger).
Da wird man zum Alphtester und Support gibts nur direkt von den Entwicklern. Waren C-Compiler und Assembler.

Ein optimierender Compiler erzeugt zuerst einen internen Metacode, welcher dann optimiert wird. Dazu gehört auch die Optimierung der Belegung der CPU-Register. Als letztes wird dann der Maschinencode erzeugt welcher nochmals optimiert werden kann.

man kann dann sogar Code wie
if ((a >> 3) & 1) …
wandeln in
BTST 3, @a
BEQ …
Die Ganze Schieberei ist ja gar nicht nötig :wink:

Wenn man „seinen“ Compiler kennt, kann man den Sourcecode so gestalten, dass dieser optimalen Code erzeugt. Dies ist dann wiederum der Grund wieso bei Benchmarks die Konkurenzprodukte schlechter abschneiden.

MfG Peter(TOO)

Wenn man „seinen“ Compiler kennt, kann man den Sourcecode so
gestalten, dass dieser optimalen Code erzeugt. Dies ist dann
wiederum der Grund wieso bei Benchmarks die Konkurenzprodukte
schlechter abschneiden.

Hehe, nicht mehr ganz die Ausgangsfrage, aber interessant. Fragt sich nur, wie ich meinen Compiler jetzt „kennenlerne“, aber da stecke ich vielleicht einfach nicht genug in der Materie drinnen. :frowning:
Danke dennoch!

Hallo Fragewurm,

Hehe, nicht mehr ganz die Ausgangsfrage, aber interessant.
Fragt sich nur, wie ich meinen Compiler jetzt „kennenlerne“,
aber da stecke ich vielleicht einfach nicht genug in der
Materie drinnen. :frowning:

Einfach den Befehlssatz der CPU und die Ausführungszeiten lernen und dann kannst du das Assemblerlisting des Compilers flüssig lesen :wink:

OK, dauert ein paar Tage …

Aber im Ernst, es gibt Unterlagen über „Mixed Language Programming“, da kann man viel über die Compiler lernen.

MfG Peter(TOO)