If / Case Switch - Weiche Performance Optimieren

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Wenn Du eh so viel mit Zufallswerten machst, mach es doch komplett davon abhängig und bau dir so was auf wie

    Quellcode

    1. ​(arc4random()%100) +1

    gibt dir dann einen Wert zwischen 1 und 100 zurück. Das "+1" könntest Du auch variabel halten. Z.B. immer im Bezug auf den Stufenwert des Helden oder geteilt durch Stärkewert oder was auch immer Du sonst so für Varbiablen hast. Das "Live"-Zusammenbauen von Gegnern in Deiner oben genannten Logik finde ich etwas sehr kompliziert gedacht.

    Aber er ist natürlich nicht ganz einfach nachzuvollziehen. Dafür gibt es dann doch zu wenig Infos. Vielleicht hilft Dir ja mein Ansatz weiter.

    Gruß
    ----
    Macht's gut und danke für den Fisch
  • mattik schrieb:


    Finde ich besser lesbar und es wird im Zweifelsfall schneller, zumindest nicht langsamer. Eigentlich sollte der Compiler das automatisch machen, aber es ist mittlerweile ziemlich schwierig geworden, vorherzusagen, was polly da so tut. Aber für Optimierungen auf dieser Ebene ist intensives Profilen und die Analyse des Kompilats notwendig, alles andere ist ziemlich blindes Gestochere. Ich würde nach wie vor versuchen, den Code erstmal nach Lesbarkeits- und Strukturaspekten zu schreiben. Das erhöht die Wahrscheinlichkeit, dass man auf höherer Ebene wesentlich lohnendere Optimierungsmöglichkeiten findet.


    Gab's da auf der Macoun 2013 nicht einen Einsteigervortrag drüber, wie man Compilerspäße im Assemblercode findet? ^^
  • kmr schrieb:

    mattik schrieb:


    Finde ich besser lesbar und es wird im Zweifelsfall schneller, zumindest nicht langsamer. Eigentlich sollte der Compiler das automatisch machen, aber es ist mittlerweile ziemlich schwierig geworden, vorherzusagen, was polly da so tut. Aber für Optimierungen auf dieser Ebene ist intensives Profilen und die Analyse des Kompilats notwendig, alles andere ist ziemlich blindes Gestochere. Ich würde nach wie vor versuchen, den Code erstmal nach Lesbarkeits- und Strukturaspekten zu schreiben. Das erhöht die Wahrscheinlichkeit, dass man auf höherer Ebene wesentlich lohnendere Optimierungsmöglichkeiten findet.


    Gab's da auf der Macoun 2013 nicht einen Einsteigervortrag drüber, wie man Compilerspäße im Assemblercode findet? ^^

    Ja, da war was. Warst du auch da? ;)
    Multigrad - 360°-Produktfotografie für den Mac
  • "Ich könnte mir vorstellen das das Ganze deutlich schneller wird wenn er es auf den Heap packt. Also erzeuge dein array mal mit dem huten alten malloc und gibt es am ende auch mit free wieder frei. Wenn Du dann wie von HNS vorgeschlagen mit Pointern drauf zugreifst , statt über indexe und nur uint_8t benutzt wie Grietsch vorschlug, dann sollte das eigentlich kein Problem mehr sein 20MB Speicher im Bruchteile einer Sekunde durchzugehen."

    Klingt super! Das sollte wohl die beste Lösung sein, aber ich scheitere gerade noch kläglich an der Umsetzung. Ich habe noch nicht mal ein Beispiel finden können wie ich mit MALLOC ein Mehrdimensionales Array im HEAP erzeugen kann das auf Objective C läuft... :(
  • RayJunx schrieb:

    "Ich könnte mir vorstellen das das Ganze deutlich schneller wird wenn er es auf den Heap packt. Also erzeuge dein array mal mit dem huten alten malloc und gibt es am ende auch mit free wieder frei. Wenn Du dann wie von HNS vorgeschlagen mit Pointern drauf zugreifst , statt über indexe und nur uint_8t benutzt wie Grietsch vorschlug, dann sollte das eigentlich kein Problem mehr sein 20MB Speicher im Bruchteile einer Sekunde durchzugehen."

    Klingt super! Das sollte wohl die beste Lösung sein, aber ich scheitere gerade noch kläglich an der Umsetzung. Ich habe noch nicht mal ein Beispiel finden können wie ich mit MALLOC ein Mehrdimensionales Array im HEAP erzeugen kann das auf Objective C läuft... :(


    mit obj-c hat das ganze auch garnix zu tun.

    ein mehrdimensionales array ist nichts anderes als ein speicherblock auf den zugegriffen wird (durch pointeraritmetik wie hier auch schon geschrieben wurde).
  • Ich weiß meine Fähigkeiten den Prozessor einen Herzkasper zu verursachen und den Speicher zu vergraulen sind nicht zu unterschätzen.
    Aber ein bisschen raffe ich es schon, im Grunde wird ja nur ein Platz im Speicher gebucht den ich anhand der Elemente mal Elemente.. entsprechend der Dimensionen und Anzahl der Elemente selber errechnen kann. Und dann kann ich über das gleiche Verhältnis Pointer bewegen um an die jeweils Stelle innerhalb dieses Speichers zu springen. Wird schon :D
  • RayJunx schrieb:

    Ich weiß meine Fähigkeiten den Prozessor einen Herzkasper zu verursachen und den Speicher zu vergraulen sind nicht zu unterschätzen.
    Aber ein bisschen raffe ich es schon, im Grunde wird ja nur ein Platz im Speicher gebucht den ich anhand der Elemente mal Elemente.. entsprechend der Dimensionen und Anzahl der Elemente selber errechnen kann. Und dann kann ich über das gleiche Verhältnis Pointer bewegen um an die jeweils Stelle innerhalb dieses Speichers zu springen. Wird schon :D


    Hihi, in der Theorie ist Pointerarithmetik wirklich einfach. *irres Kichern* Literaturempfehlung: klick

    Wenn Du das Buch gelesen, den Inhalt verstanden und fehlerfrei angewendet hast, bist Du ein echter Mann, mein Sohn. 8o
  • Pointers sind nicht wirklich mein Lieblingsding ;)
    Gibts auch was gutes in Deutsch zu dem Thema? Englisch ist zwar schon ok aber je nachdem wie die mit Fachwörtern um sich werfen sind mir bei Sachbüchern ausnahmsweise oft auch die Deutschen Übersetzungen lieber.

    Und noch eine Frage, nur um einen Refferenzwert zu haben. Wie viele Performance könnte ich theoretisch aus einem 2.7 GHz Intel Core i7 herausholen,
    sagen wir wie oft:

    Alle Variablen in uint_8t und im HEAP:

    Variable1 = Variable2 + Variable3;
    pro Sekunde

    Oder
    if (Variable1==Variable2) Variable3=Variable1;
    pro Sekunde

    Weiß ja nicht wie viel Leistung ich wirklich vom System nutzen kann, mal davon ausgegangen es läuft nichts sonst im Hintergrund.
    Und wenn ich von nahezu 100% ausgehen kann, wie viele solche Operatoren packt die CPU dann pro Kern und Takt?

    Wenn dieser Theoretische Wert Bekannt ist könnte ich abschätzen wie effektiv ich die Geschichte bereits betreibe. :rolleyes:
  • Sowas kann man nicht so einfach pauschal sagen, dafür sind heute CPU einfach zu komplex aber ich denke so eine einfache Sache würde locker in einem Zyklus abgearbeitet werden. Bei nem 7 Core mit rund 3GHz hast du dann bei optimiertem Code ca. 2 Milliarden Berechnungen pro Sekunde.

    Gruss

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • RayJunx schrieb:

    Und noch eine Frage, nur um einen Refferenzwert zu haben. Wie viele Performance könnte ich theoretisch aus einem 2.7 GHz Intel Core i7 herausholen,

    Wie Thallius schon schrieb, ist das schwierig, generisch zu sagen.

    Laut Intel[1] ist MOV und ADD in einem (bzw sogar 1/2) Takt, von daher vernachlässigbar -- d.h. bei optimalem Zugriff (Cache-coherence) bist Du in etwa bei der Speicherbandbreite. Ich würde ganz grob schätzen, an 10 GB/s solltest Du theoretisch herankommen, d.h. 10'737'418'240 pro Sekunde :) Wieviel man praktisch schafft, ist schwer zu sagen (auch wegen bytes vs. int; Parallelisierung, Vektorisierung, realistische cache-effizienz, ...).

    [1] Intel® 64 and IA-32 Architectures Optimization Reference Manual, Appendix C, 2014
    C++
  • Komme auf etwa 280Millionen x 7 Operationen gemischter Art also knapp 2.000.000.000 pro Sekunde. Aber das ist noch Single Core. Und es macht keinen Unterschied ob ich einen Großen Array nehme oder es vorher in einen kleinen Packe, der checkt und optimiert das offenbar selber.
    Gibts eigentlich irgendwo gute Bücher oder Beispiele, Tutorials etc. wie man mehrere Kerne beschäftigen kann, oder in wie fern geschieht das schon von selbst? :rolleyes:
  • Naja selbst wenn, dann kannst du ja nicht davon ausgehen das ale User deiner App 5 oder 7 Kerne haben. Das ist keine Lösung. Wenn Du wirklich 2G an Berechnungen pro Sekunde brauchst, dann wird es dringend Zeit dein ganzes Konzept zu ändern.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Gibts eigentlich irgendwo gute Bücher oder Beispiele, Tutorials etc. wie man mehrere Kerne beschäftigen kann, oder in wie fern geschieht das schon von selbst?

    Also wir haben das Thema Geschwindigkeitssteigerung von Rechnern früher (= letztes Jahrtausend) in einer Vorlesung für das 5te Semester (Technische Informatik / Elektrotechnik) angeboten und angerissen und auf die Details kam man erst mit einem Praktikum zu Cache-Speichern und Pipelines. Dann wußte man aber erst worauf man achten soll. D.h. mal schnell eben so anlesen kann man sich diese Thematik nicht, wenn das schon vor Jahren Vertiefungsstudium für den Fachmann war.
    Und um die Frage von oben wenigstens zur Hälfte zu beantworten: nein, Parallelisierung auf mehrere Kerne geschieht nicht von selbst. Das muss entweder der Compiler machen (kann er selten) oder der Programmierer (durch Threads oder ein von ihm eingesetztes Framework: suche z.B. mal was OpenCL ist).
  • Ohne Zweifel Dauert es sicher Jahre wenn ich das Nebenher fachmännisch anpacken würde. Im Moment will ich mich dem Thema nur mal vorsichtig annähern und zumindest grob das tun was der Performance zuträglich ist. ^^ Und OpenCL klingt super. Das währe der nächste Schritt. Ich bin derweil dabei wieder mehr mit meinem Raspberry zu basteln, Morgen kommt ein Zweiter dann baue ich einen mini Cluster und will mich auch mehr mit Linux anfreunden. Und ganz in Ferner Zukunft währe das: "Nvidia bietet eine OpenCL-Implementierung für seine GPGPU-Schnittstelle CUDA unter Linux" vermutlich genau das was mir schon vorschwebte. Schätze die Grafikkarten rocken was Performance angeht. Wie gesagt alles nur Spielerei, nichts kommerzielles, für Spieler am Iphone.