Fragen zur Performance



  • Hi all

    hier einige weiteren fragen von mir ;P
    im mittelpunkt steht die Performance...

    1. wann sollte man ein objekt als Referenz bzw über einen Pointer übergeben ?
    2. wenn ich static-functionen in einer klasse defeniere, wird dann das objekt der klasse gröser?
    3. ist es besser binäre-operatoren global zu defenieren?
    4. wie übergebe ich ein array am besten damit ich folgende konstruction verwenden kann :

    afunction( aobject.getarray() );
    

    5. ist unsigned, signed forzuziehen? //denke nicht relevant
    6. ist short, integer forzuziehen? // denke nicht relevant
    7. ist integer-, float-Arithmetik forzuziehen?
    8. sind generische klassen langsamer als "normale" klassen?
    9. sollte man dynamische typprüfung vermeiden?
    10. sollte man for-each beforzugt verwenden?
    11. sollte man mehr-dimensionale arrays generell auf einem ein-dimensionalen arrays abbilden?
    12. ist es schneller wenn ich in arrays, über Zeiger-Arithmetik aufs gewünschte element zugreife als wenn ich den [] operator verwende?
    13. wann sollte generell alles als inline definieren?
    14. sollte man kleinere schleifen in der regel ausschreiben?
    15. welche "performance-killer" gibt es noch?



  • 1. wann sollte man ein objekt als Referenz bzw über einen Pointer übergeben ?

    kein unterschied
    [/quote]

    2. wenn ich static-functionen in einer klasse defeniere, wird dann das objekt der klasse gröser?

    nein, wird nicht größer

    3. ist es besser binäre-operatoren global zu defenieren?

    ja, aber nur wegen der symmetrie, auch das linke kann durch automatik-casting dem anderen angepaßt werden.

    4. wie übergebe ich ein array am besten damit ich folgende konstruction verwenden kann :

    afunction( aobject.getarray() );
    

    referenz oder zeiger sind gleich schnell.

    5. ist unsigned, signed forzuziehen? //denke nicht relevant

    bei modulo-rechnungen und divisionen ist unsigned tendeziell schneller. da klappt das bitgefummele des optimierenden compilers gelegentlich besser, als wenn da noch ein vorzeichen rumbaumelt.

    6. ist short, integer forzuziehen? // denke nicht relevant

    nein, short schadet manchmal sogar, wenn die überflüssigen bits erst abgeschnippelt werden müssen. außer, du sparst in richtig großen arrays speicher und bist deswegen seltener auf der auslagerungsdatei oder öfters im 1st-level-cache.

    7. ist integer-, float-Arithmetik forzuziehen?

    ja und neun. die vollständige antwort auf diese frage würde allein ein buch füllen.

    8. sind generische klassen langsamer als "normale" klassen?

    nein.

    9. sollte man dynamische typprüfung vermeiden?

    ja

    10. sollte man for-each beforzugt verwenden?

    ja

    11. sollte man mehr-dimensionale arrays generell auf einem ein-dimensionalen arrays abbilden?

    nein, aber auch nicht das gegenteil.

    12. ist es schneller wenn ich in arrays, über Zeiger-Arithmetik aufs gewünschte element zugreife als wenn ich den [] operator verwende?

    gleich

    13. wann sollte generell alles als inline definieren?

    inline hat 2 bedeutungen.
    a) mit schlüsselwort inline: nie, das macht der compiler von allein
    b) innerhalb der klasse: egal

    14. sollte man kleinere schleifen in der regel ausschreiben?

    nur echte mikroschleifen, die innen auch fast nix tun.
    keine allgemeine antwort. lieber messen.

    15. welche "performance-killer" gibt es noch?

    die fettesten performancekiller sind:
    a) schlechte auswahl der datenstrukturen, zum beispiel ne warteschlange im vector mit pop() in O(n)
    b) schlechte auswahl der algoritghmen, zum beispiel kollisionserkennung in O(n^2)
    c) gigantomanismus und firlefanz, zum beispiel alles in irgendwelche template-sachen gepackt, und am ende alles unlesbar und doppelt so viel code wie eine vernünftige implementierung.
    d) ganz einfach das design nicht schlang und übersichtlich gehalten und am ende kann man die durch messung erkannten performancekiller nicht reparieren, weil das prog einfach verfrickelt ist

    edit: tippfehler bei 5. sollte unsigned heißen



  • Speed schrieb:

    1. wann sollte man ein objekt als Referenz bzw über einen Pointer übergeben ?

    Falls du meinst, wann es sich lohnt, einen Zeiger oder eine Referenz im Gegensatz zu einem Objekt zu übergeben: Grundsätzlich, sobald komplexere, nicht-skalare Typen wie Instanzen von Klassen im Spiel sind.

    Speed schrieb:

    6. ist short, integer forzuziehen? // denke nicht relevant

    Siehe dazu auch diesen Thread.

    volkard schrieb:

    bei modulo-rechnungen und divisionen ist signed tendeziell schneller. da klappt das betgefummele des optimierenden compilers gelegentlich besser, als wenn da noch ein vorzeichen rumbaumelt.

    Meinst du nicht unsigned ?



  • vielen dank für die schnellen Antworten!

    Zitat:

    7. ist integer-, float-Arithmetik forzuziehen?

    ja und neun. die vollständige antwort auf diese frage würde allein ein buch füllen.

    kennt jemand aufklärende links?

    Ach ja mir ist noch etwas eingefallen...
    villeicht habt ihr vom Karazuba-Algorithmen gehört ? würde das heutzutage einen Performance-Boost bringen oder ist das bereits in einem cpu realisiert?
    für alle die den algo nicht kennen : http://www-i1.informatik.rwth-aachen.de/~algorithmus/algo16.php



  • Speed schrieb:

    Ach ja mir ist noch etwas eingefallen...
    villeicht habt ihr vom Karazuba-Algorithmen gehört ? würde das heutzutage einen Performance-Boost bringen oder ist das bereits in einem cpu realisiert?

    ist drinnen. und noch viel viel viel viel mehr. natürlich nur für die typen, die der prozessor kennt, wie int und double.
    karatsuba nimmste, wenn du die nen eigenen typ für lange zahlen mit tausenden von stellen bastelst.


Log in to reply