inline wirklich 100% genauso schnell wie wenn ich den Funktionstext nochmal reinschreibe?
-
camper schrieb:
NeWs0fTzzz schrieb:
Ich weiß was ich tue.
Wenn dem so ist, müsstest du auch wissen, dass diese Frage in diesem Unterforum falsch platziert ist. Schließlich handelt es sich nicht um ein Sprachproblem sondern um das einer bestimmten Implementation - aus Sicht der Sprache allein ist die Fragestellung sogar völlig sinnlos.
Naja eigentlich ist es doch ein Sprachproblem, nämlich welche Möglichkeiten dir Standardkonformes C++ für so eine Aufgabe gibt, und da fällt mir spontant nur #include oder eine inline Funktion ein..
-
Dann mach es doch einfach so!
-
Mr X schrieb:
Dann mach es doch einfach so!
Die Frage ob eine inline Funktion genauso schnell ist hat mir ja immer noch keiner wirklich beantwortet, oder sogar die Frage ob der Compiler die Funktion doch nicht als inline benutzen würde O.o
Das war ja auch der Sinn dieses Threads..
Ich benutzen übrigens den g++ unter Debian, wenn das etwas ausmacht! ^^
-
NeWs0fTzzz schrieb:
- Ich will IMMER NOCH NICHT optimieren.
Du sagst doch, dass du deine Riesen-switch-Anweisung aus Angst, Performance zu verlieren, in einer Riesen-Funktion hälst. Dann ist dies folgerichtig ein Optimierungsversuch von dir (denn davon hat Shade of Mine gesprochen, er hat keine weiteren Optimierungen vorgeschlagen), der immens zu Lasten der Übersichtlichkeit geht. Shade of Mine hat dir erklärt, dass Funktionsaufrufe kaum Leistung kosten und diese "Optimierung" somit nutzlos ist. Du kannst also ruhig Unterfunktionen bilden und auf includes und dergleichen verzichten. Problem gelöst!
Wenn du seinen Worten nicht traust bzw. anderer Ansicht bist, dann miss doch einfach mal ein paar Millionen/Milliarden Durchläufe und sieh dir den tatsächlichen Unterschied an (am besten in Relation zur Häufigkeit der Funktionsaufrufe in deiner Anwendung). Das würde mich auch interessieren (=> also ggf. hier posten!).
NeWs0fTzzz schrieb:
- Nein, Polymorphie ist nicht der richtige Ansatz.
Warum nicht?
NeWs0fTzzz schrieb:
Ich möchte nur wissen wie man Funktionsteile OHNE Verluste in andere Dateien auslagern kann.
Ohne nennenswerte Verluste? Siehe 1).
-
Das halte ich für eine sehr schlechte Idee.
Der Code wird schwer wartbar und es gibt viel Code Duplikation.
-
NeWs0fTzzz schrieb:
- Ich weiß was ich tue.
Das macht leider nicht den Anschein. Bitte nicht falsch verstehen. Es kann durchaus sein, dass Du wirklich weißt, was Du tust. Aber damit man Dir sinnvoll helfen kann, solltest Du uns das auch zeigen.
- Nein, Polymorphie ist nicht der richtige Ansatz.
So, wie Du es beschrieben hast, macht Dein 'switch' nichts anderes, als Polymorphie schlecht nachzubauen. Von daher wäre Polymorphie also sehr wohl der richtige Ansatz. Wenn er das nicht ist, erzähl doch mal genauer, was Dein 'switch' machen soll.
Ich möchte nur wissen wie man Funktionsteile OHNE Verluste in andere Dateien auslagern kann.
Lager einfach in Funktionen aus, die Du aufrufst, da gibt es keinen Verlust. Im Gegenteil, der Code könnte dadurch sogar schneller werden (auch wenn Dir das ja nicht wichtig ist), weil Deine Hauptfunktion dadurch kleiner wird.
-
NeWs0fTzzz schrieb:
Ich möchte nur wissen wie man Funktionsteile OHNE Verluste in andere Dateien auslagern kann.
dann probiers halt aus.
was man dir sagt glaubst du doch sowieso nicht.
-
Shade Of Mine schrieb:
die richtige variante waere sehr sehr viele kleine funktionen zu haben. die regel ist etwa so, dass jede Funktion die ueber 6 Zeilen Code enthaelt zu gross ist. Die meist angewandte regel sagt dass 10 zeilen code zuviel sind. Manche aktzeptieren auch noch 12 zeilen code. aber dann wird es schon langsam zu viel und ist nur noch in ausnahme situationen sinnvoll.
und solche ausnahme situationen kommen enorm selten vor. viele leute denken immer, dass sie sich in so einer ausnahme situation befinden, aber das ist so gut wie nie der fall...
Zählst du hier Variableninitialisierungen mit? Wie sieht es mit geschlossenen geschweiften Klammern in einer einzelnen Zeile aus? Und wie mit Asserts und sanity Checks?
Also 12 Zeilen inklusive Checks für evt. falsche Eingaben sind oft einfach nicht möglich, wenn man auf einer etwas komplexeren Datenstruktur arbeitet und das auslagern von Code macht da oft auch keinen Sinn da man den Code nur an dieser Stelle benötigt und man beim Auslagern ne ewig lange Parameterliste hat und dann effektiv 3Zeilen Code auslagern kann von ursprünglich 5-6. Da hab ich meine 15-20Zeilen Code lieber in einer Funktion da hat man imho mehr davon.
-
Was ich lustig finde ist, dass Funktionen ja durchaus auch schneller sein können als alles inline zu machen
Schliesslich ist weniger Code da und somit passt mehr in die Caches rein 
Deshalb:
- du weißt nicht was du tust. Deine Frage ist nämlich genau falsch rum. Nicht falsch verstehen bitte, aber das was du willst, das will man nicht. Es ist der komplett falsche Ansatz. Optimierungen setzt man an nachdem der Code richtig aufgeteilt ist. Bedenke wirklich: mehr als 10 Zeilen pro Funktion sind furchtbar.
Kleine Funktionen sind auch die beste Möglichkeit für Optimierungen.
-
wenn du nicht optimieren willst, dann pack das lange switch in eine Funktion. Du wirst den Performance Unterschied nicht messen können (uU läuft das Programm um 1ms schneller uU um 1ms langsamer).
-
vielleicht ist polymorphie nicht passend, aber es passt öfter als du denkst... die meisten switch Konstrukte die ich so sehe, sind mit polymorphie lösbar. ob das dann sinnvoller ist oder nicht, hängt vom speziellen fall ab - aber gerade wenn ein switch lange ist, dann ist die wahrscheinlichkeit dass polymorphie besser ist recht hoch.
-
Shade Of Mine schrieb:
Bedenke wirklich: mehr als 10 Zeilen pro Funktion sind furchtbar.
10? Da bekommst du aber nen sehr tiefen Callstack bei komplizierten Sachen.