Ergebnis 1 bis 8 von 8

Thema: Schleifen

  1. #1
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    Schleifen

    Hallo,

    ganz allgemeine Frage nach der "Effizienz" von Schleifen.

    Ich würde logisch betrachtet sagen, beide (folgenden) Möglichkeiten ergeben keinerlei Unterschied in der Geschwindigkeit der Zählungen;
    dennoch habe ich irgendwie im Hinterkopf, dass es irgendwo schon einen Unterschied machen kann. Allerdings ergibt eine Multiplikation
    der Zähler in beiden Schleifen das Gleiche: ( i * j ) oder ( j * i ) ==> ( 8294400 ). ...

    Code:
    for(int i = 0; i < 3840; i++)
            for(int j = 0; j < 2160; j++)
                    // 8294400
    Code:
    for(int i = 0; i < 2160; i++)
            for(int j = 0; j < 3840; j++)
                    // 8294400

    OffTopic:
    PS: Gibt es "Trägheit" eigentlich auch bei Software-Prozessen!? xD´
    PPS: Die Frage ist (vom Prinzip aus gesehen) ernst gemeint. *gg*

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

  2. #2
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    AW: Schleifen

    Und dann (hier) noch speziell für JavaScript: welches der beiden folgenden bedeutet effizientere Speichernutzung?

    Code:
    for(var id in dom.id)
    {
            var tag = dom.id[id];
    }
    Code:
    var tag;
    
    for(var id in dom.id)
    {
            tag = dom.id[id];
    }
    Ich sehe beides als Möglichkeit: die erste Variante würde bedeuten, dass nach der Schleife eine dort unnötige Variable nicht mehr gesetzt wäre,
    also mehr freigegebener Speicher. Dafür aber sieht das so aus, als müsste diese Variable "tag" innerhalb der Schleife mit jedem ihrer Durchläufe wieder-
    holt erst allokalisiert werden!? ... hingegen bei der zweiten Variante würde "tag" nur einmal allokalisiert, bliebe dann aber unnötiger Weise nach der Schleife
    dennoch aktiv, so lange man nicht "delete tag" aufruft. hm? ... und ja: "Allokalisierung" ist eh was anderes quasi; also weil die Länge des Wertes der "tag"-
    Variable erst bei ihrer Zuweisung fest steht. ... nya~ wie löst JavaScript sowas - und wie steht's mir dem Gleichen in C bzw. ASM?

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

  3. #3
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    AW: Schleifen

    (beide probleme zusammen gesetzt ergeben evtl. die lösung (^_^))

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

  4. #4
    Registered User
    Registriert seit
    Jul 2003
    Beiträge
    240
    Renommee
    520

    Re: Schleifen

    Beim Compilieren wird eine for-Schleife im Wesentlichen in eine if-Abfrage und zwei goto-Anweisung übersetzt. Zwei Schleifen = zwei if-Abfragen + vier goto-Anweisungen.
    Gesprungen wird im ersten Fall:
    3840 * (2160 + 1) + 1 = 8298241 (Davon 3841 conditonal jumps)

    Und im zweiten Fall:
    2160 * (3840 + 1) + 1 = 8296561 (Davon 2161 conditonal jumps)

    Wobei nur die conditional jumps zum Leeren der Pipeline wg. falscher Jump-Prediction führen können und damit teuer sind. Bei aktuellen Compilern ist es aber eh egal: Die optimieren Dir die Schleife ggf. komplett weg, verschieben Anweisungen ohne Seiteneffekte raus etc.

    Zur der Variablen: JS wird von den Browsern ja auch just-in-time kompiliert und da es sich um eine lokale Variable handelt hat die einen festen Platz auf dem Stack - da wird nix neu allokiert
    Geändert von dirdi (11.04.2017 um 15:50 Uhr)
    thx 4 reading

  5. #5
    Registered User
    Registriert seit
    Oct 2007
    Beiträge
    244
    Renommee
    234

    AW: Schleifen

    Wie dirdi schon geschrieben hat, hängt es vom Compiler inkl. jumps ab. Es gibt Techniken wie "Function enroll" die sowas ggf. durch größeren Code optimieren. Auch musst du schauen, wie deine Variablen abgelegt werden. Das hat dann zusätliche Cache misses zu folge. Wenn du also die Indexierung so machen kannst, dass du die Variablen ggf. im Cache hat ist das viel schneller.
    Wenn du in Javascript programmierst, dann ist der Overhead vom JIT meist größer als alles andere, bei C oder ASM siehts das schon anders aus.

  6. #6
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    AW: Schleifen

    Zitat Zitat von rec
    Wenn du also die Indexierung so machen kannst, dass du die Variablen ggf. im Cache hat ist das viel schneller.
    Sowas wie ein "Object Pool" meinste damit auch, hm? Und in dem Sinne, dass Speicher-Allokalisierung langsam ist, hm?

    Zitat Zitat von rec
    Wenn du in Javascript programmierst, dann ist der Overhead vom JIT meist größer als alles andere, bei C oder ASM siehts das schon anders aus.
    Ich überleg auch schon ... eigentlich wäre mir JavaScript am liebsten (zumal ich dann "Node.js" statisch kompilieren und ein INITRAMFS damit begründen könnte, ohne
    dass hier weitere Software nötig wäre). Aber auch 'ne eigene Shell (v.a. für eigene WebSocket-Konsolen, aber auch (eigene) Datenbank-Queries) bedenke ich - ich denke,
    wenn ich mich selbst um die Implemnetation des Prozess-Stack etc. kümmerte, könnte ich auch aus dem Overhead von JS ausbrechen somit, oder? Also sogar eigenes
    Memory Management, mit Pointer-Arithmetik auch zur eigenen Optimierung etc.? Funktioniert ja auch bei "asm.js", oder?

    Ich habe auch schon überlegt, dass JavaScript evtl. nicht so effizient arbeitet, weil hier dynamische Variablen-Zuweisungen möglich sind - also diese nicht direkt mit einem
    Type anzugeben sind und auch zur Laufzeit den Typ veränderbar halten. ...

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

  7. #7
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    AW: Schleifen

    OffTopic:
    https://brennan.io/2015/01/16/write-a-shell-in-c/
    Nur als Hinweis für alle, die darüber noch nicht so recht Bescheid wissen. ...

    Jedenfalls schreibe ich tatsächlich meine (Web-(Socket-))Shell in C, was (für mich jedenfalls) auch einfacher ist, da es hier ja z.B. "scanf" gibt.

    Auch der Protokoll-Parser (also Web-Socket v.a., damit ich direkt eine eigene Web-Console erhalte) ist damit wesentlich einfacher und schöner;
    zwar gibt's in JS auch RegExp, aber die erscheinen mir etwas zu ineffizient - im Vergleich - oder? Overload jedenfalls. ... zumal ich finde, wenn in
    C direkt implementiert wird, so macht es direkt aufmerksam auf weitere "Interna", bspw. die Sache mit der Buffer-Größe für alle Eingaben. Man
    kann schließlich auch vor solcher Problematik mit "noch höheren" Sprachen weglaufen, sollte sie aber weniger ignorieren und sich selbst darum
    kümmern. IMHO. ;-)

    Ganz im Allgemeinen würde ich sowieso lieber den größten Teil meiner Software in (ANSI) C entwickeln - damit das später einfacher wird, denke
    ich über eine eigene API nach, die ähnlich der von "Node.js" gehalten ist, nur eben in C diesmal. Damit eröffnet sich jede "Node.js"-Funktionalität
    auf's einfachste, so scheint es mir. (^_^).


    Danke für eure Antworten bzgl. Schleifen. Ich merke mir also mal als allgemeine Regel: höhere Schleifen-Anzahlen sollten kleinere Werte
    sein, die höhere Anzahl an Durchläufen kommt möglichst in die tieferen/mittleren Schleifen. Korrekt? :-)

    OffTopic:

    PS: Wer o.g. Beispiel-Website selbst nachvollzieht, der kann in (ebenso o.g.) Richtung "bufsize" zusätzlich entweder/und/oder noch ein oder zwei
    weitere "#define" setzen, damit die Erhöhung der Buffer-Größe nur eine gewisse Anzahl von Erhöhungen geschieht und/oder einfach eine maximale
    Buffer-Größe definiert wird. Damit "realloc" nicht unendlich häufig geschieht (bad...). Jfyi. (^_^).

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

  8. #8
    Quantenmechaniker
    Registriert seit
    Aug 2002
    Beiträge
    1.921
    Renommee
    283

    AW: Schleifen

    PS: Wer Web-Ressourcen kennt, wo es um die Ersetzung der (C-)Funktionen um sichere Pendants geht, immer her damit!

    Ich weiß schon, dass man besser die Funktionen mit "n" im Name verwendet, so dass also direkt Längen mit angeben sind;
    vor kurzem las' ich noch ein Buch (>1<), wo es hieß, dass "scanf" (sowohl mit als auch oder "n") eigentlich auch unsicher ist?

    Gibt's einen guten ÜBERBLICK (ein Cheat-Sheet evtl.) über (alle?!) solche Sicherheitsmaßnahmen?

    Grützle.

    (<1>) C von A bis Z (@ Galileo OpenBook)

    1 2 3 4 5 6 7 8
    2 1 4 3 6 5 8 7
    3 4 1 2 7 8 5 6
    4 3 2 1 8 7 6 5
    5 6 7 8 1 2 3 4
    6 5 8 7 2 1 4 3
    7 8 5 6 3 4 1 2
    8 7 6 5 4 3 2 1

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Ähnliche Themen

  1. Schleifen verschachteln
    Von Outcast im Forum C / C++
    Antworten: 10
    Letzter Beitrag: 21.04.2003, 13:42
  2. [PHP] while schleifen mit if bedingungen
    Von Zensor im Forum PHP, Perl und ASP
    Antworten: 7
    Letzter Beitrag: 30.08.2002, 16:27
  3. Pascal: ';' bei if-schleifen
    Von Mystique::BJ::x im Forum Pascal / Delphi
    Antworten: 7
    Letzter Beitrag: 20.10.2001, 13:34
  4. For und If Schleifen problem
    Von Anything im Forum Pascal / Delphi
    Antworten: 3
    Letzter Beitrag: 04.05.2001, 14:14
  5. for Schleifen???
    Von Gruener_Chaot im Forum Java
    Antworten: 3
    Letzter Beitrag: 13.07.2000, 08:48

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •