Variablendeklaration in Schleife in Perl genauso Todsünde wie in C/C++?



  • knivil schrieb:

    Sorry, damit stehst du wohl recht alleine da.

    Ja, und auch mein Lehrer. Mann, was sind wir alleine ... :p

    knivil schrieb:

    Ansichtssache! Der Kompiler ist ziemlich gut im Umordnen von Code um Laufzeit einzusparen. Hast du dir den generierten Assemblercode bei aktivierter Optimierung mal angesehen? Ich vermute mal: Nein.

    Ich vermute mal, es kommt darauf an, was für einen Compiler man verwendet und welche Optimierungsfunktionen man zulässt, oder?

    knivil schrieb:

    Weiterhin ist nach so Mikrooptimierungen bei einer interpretierten Sprache zu fragen ... sehr fragwuerdig.

    Du weißt schon, dass Perl nur bei Programmstart interpretiert wird (heißt, der gesamte Code wird vorkompiliert) und dann während der Programmausführung recht flott ist?



  • Es kommt auch darauf an, wie viel Zeit eine Verschiebung des Stackpointers im Vergleich zum restlichen Code benoetigt. Wahrscheinlich weniger als 1%, na Wahnsinn.

    Ja, und auch mein Lehrer. Mann, was sind wir alleine

    Deinen Lehrer als Referenz anzugeben, macht die Sache nicht besser. Er kann auch eine Null sein. Null + Null ist immer noch Null. Ziemlich einsam.

    Du weißt schon, dass Perl nur bei Programmstart interpretiert wird (heißt, der gesamte Code wird vorkompiliert) und dann während der Programmausführung recht flott ist?

    Quellen?

    Ich vermute mal, es kommt darauf an

    Also Todsuenden ... es kommt halt drauf an? Nein, bei Todsuenden kommt es nicht drauf an. Das ist dein Fehler.



  • knivil schrieb:

    Es kommt auch darauf an, wie viel Zeit eine Verschiebung des Stackpointers im Vergleich zum restlichen Code benoetigt. Wahrscheinlich weniger als 1%, na Wahnsinn.

    Gut, ist ein Argument. Trotzdem zeugt es von unnötiger Laufzeit.

    knivil schrieb:

    Deinen Lehrer als Referenz anzugeben, macht die Sache nicht besser. Er kann auch eine Null sein.

    Auch ein Argument. Schließlich kennst du ihn nicht, und mein persönlicher Eindruck wird wohl hier nicht zählen.

    knivil schrieb:

    Null + Null ist immer noch Null. Ziemlich einsam.

    Woher willst du wissen, ob ich eine Null bin, nur weil ich genau programmiere? Genausogut könnte ich sagen, dass du eine Null bist, weil du anscheinend nicht sehr genau programmierst ... oder vermeidest du etwa doch Deklarationen in Schleifen?

    knivil schrieb:

    Quellen?

    "Perl in 21 Tagen" (obwohl man der Zeitangabe nicht trauen sollte, steht doch recht viel interessantes drin) und ein Buch über Perl und CGI-Programmierung, aber der exakte Name will mir nicht einfallen ... ich weiß allerdings noch, dass ein bescheuertes Nudelgericht auf dem Cover zu sehen war.

    knivil schrieb:

    Also Todsuenden ... es kommt halt drauf an? Nein, bei Todsuenden kommt es nicht drauf an. Das ist dein Fehler.

    Wow. Du hast ein rhetorisches Mittel zur Verdeutlichung meiner Meinung, dass Deklarationen in Schleifen nichts zu suchen haben, ernstgenommen (dabei bin ich nicht mal religiös). 🙄

    Nun, es verlangsamt die Ausführung von Programmen, auch wenn sie noch so gering sein mag, und sie lässt sich ganz einfach vermeiden, oder? Und im übrigen, ICH mache es ja nicht.



  • Der aus dem Westen ... schrieb:

    In C/C++ ist folgende Anweisung eine Todsünde:

    Riesenquatsch.

    Erstens gibt es kein C/C++, sondern nur C und C++. In C ist es teilweise verpönt, so zu schreiben. In C++ ist es höchst angesagt.

    Zweitens ist es potentiell schneller, denn wie Du weißt, ist der Wert dieser Auto-Varialben, wenn sie nicht initialisiert wird, undefiniert. Und wozu? Damit der Compiler die Variable einfach selber herausschubsen kann. Aber er muß es nicht! Was, wenn er die Variable in ein Register stecken will? Dann ist sie lokal schneller. Und der Compiler kann immer die lokale Version zur globaleren umbasteln, er kann aber nicht immer die globalere Version zur lokalen umbasteln, weil vielleicht macht ja jemand was nach der Schleife damit.

    Drittens ist es sicherer, denn dann kann man nicht per Tippfehler oder sowas später auf die längst ausgediente Schleife zugreifen. Sie sollte nur so lange leben, wie man sie auch braucht.

    Viertens macht man Klasseninstanzen so lokal wie möglich und es wäre unharmonisch, das mit ints anders zu machen. http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Declare#Answ

    Ich muß nicht betonen, wie traurig ich es finde, daß ein Lehrer so auf seinem 1985-er Stand geblieben ist.



  • Es gibt verschiedene Sichtweisen, wenn man vom Kompiler spricht. Jedenfalls wird fuer Perlprogramme kein Maschinencode zur Laufzeit erzeugt, wenn ich http://oreilly.com/catalog/pperl3/chapter/ch18.html richtig verstanden habe.



  • Der aus dem Westen ... schrieb:

    dies die Laufzeit erheblich verschlechtern, denn der Stackzeiger wird immer wieder verschoben.

    Das ist einfach nicht der Fall. Der Compiler kann auch den Stackzeiger bei Funktionseintritt verschieben, nämlich so, daß alle lokalen Variablen überdeckt sind, und beim Verlassen ihn zurücknehmen. Er muß gar nicht bei jeder Variablendefinition daran rumwerkeln, denn er weiß, wieviel Stack maximal gebraucht wird. Super, gell?



  • knivil schrieb:

    Es gibt verschiedene Sichtweisen, wenn man vom Kompiler spricht. Jedenfalls wird fuer Perlprogramme kein Maschinencode zur Laufzeit erzeugt, wenn ich http://oreilly.com/catalog/pperl3/chapter/ch18.html richtig verstanden habe.

    Soweit ich weiß, wird nur für eval-Anweisungen dynamisch Code zur Laufzeit erzeugt. Alles andere wird vorab kompiliert ... aber ich lasse mich gerne belehren.

    volkard schrieb:

    Der aus dem Westen ... schrieb:

    dies die Laufzeit erheblich verschlechtern, denn der Stackzeiger wird immer wieder verschoben.

    Das ist einfach nicht der Fall. Der Compiler kann auch den Stackzeiger bei Funktionseintritt verschieben, nämlich so, daß alle lokalen Variablen überdeckt sind, und beim Verlassen ihn zurücknehmen. Er muß gar nicht bei jeder Variablendefinition daran rumwerkeln, denn er weiß, wieviel Stack maximal gebraucht wird. Super, gell?

    Schon. Aber kann man sich darauf verlassen, dass er immer so schlau ist? Ich weiß nicht, nach welchen Kriterien der Compiler dies entscheidet ...



  • Der aus dem Westen ... schrieb:

    Variablendeklaration in Schleife [...] Todsünde [...]?

    Also wenn ich Perl verwende, dauert das Öffnen der Datenbank 30ms, das Starten des Skrips selber 20ms, und das Skript macht wenig, so daß die Laufzeit des Skripts bei weitem weniger ist, als das Starten. Deswegen würde ich wie in C++ schreiben, also lokal definieren.
    Ich traue aber Perl nicht, daß es so selbstverständlich wie C++ optimiert. Ich würde es ausmessen und hoffen, daß es optimiert.



  • dynamisch Code zur Laufzeit erzeugt. Alles andere wird vorab kompiliert

    Der vorkompilierte Code muss nicht Maschinencode sein.



  • läßt sich doch ausprobieren:

    time perl -e 'my $MyValue; for($i=0; $i<1e6; $i++){$MyValue=0;}'
    time perl -e 'for($i=0; $i<1e6; $i++){my $MyValue=0;}'
    

    bei mir ist ein Unterschied, sind aber auch mehr als 10000 loopings



  • knivil schrieb:

    dynamisch Code zur Laufzeit erzeugt. Alles andere wird vorab kompiliert

    Der vorkompilierte Code muss nicht Maschinencode sein.

    Zur Laufzeit, wo die Maschine bereits feststeht, ein Programm in eine Zwischensprache kompilieren? Warum nicht direkt in binär? Die Scripte sind vorhanden, der Interpreter ist vorhanden, die Zielmaschine ist bekannt ... tut mir leid, vielleicht reicht mein Horizont einfach nicht weit genug, aber mir würde nicht einfallen, warum man in eine ähnliche Sprache wie den IL-Code von .NET kompilieren sollte.



  • Der aus dem Westen ... schrieb:

    aber mir würde nicht einfallen, warum man in eine ähnliche Sprache wie den IL-Code von .NET kompilieren sollte.

    Warum nicht? Ist viel einfacher.
    Weil du plötzlich nicht mehr dich mit der Hardware rumschlagen musst. Du musst nur deine Virtuelle Machine ausführen, erlaubt dir gewisse optimierungen zur Laufzeit zu machen, ermöglicht eine gewisse Dynamik die ohne schwer möglich wäre und vereinfacht den Codes der Interpreters/Compilers um Dimensionen.


Anmelden zum Antworten