Deklarieren von Variablen hinter der Schleife oder innerhalb der Schleife? - Seite 4

 

Entschuldigung, die Optimierung wurde in den Projekteinstellungen ausgeschaltet.

Code:

   CStopWatch sw; // Секундомер, для замера времени
   
   sw.Start();
   for (int i = 0; i < 10000000; i++)
   {
      string st = (string)i;
   }
   pr("Test1, время выполнения: " + sw.Stop());

   sw.Start();
   string st = "";
   for (int i = 0; i < 10000000; i++)
   {
      st = (string)i;
   }
   pr("Test2, Время выполнения: " + sw.Stop());


Nicht optimierte

Test1, время выполнения: 0.548275 сек.
Test2, Время выполнения: 0.313978 сек.

Mit Optimierung

Test1, время выполнения: 0.420523 сек.
Test2, Время выполнения: 0.545999 сек.

Bei der Optimierung ist das Gegenteil der Fall, ich habe es mehrmals überprüft.

 
Aleksandr Matveev:

Sie sollten zuerst die Grundlagen lernen und dann Ihren Standpunkt beweisen. Sie würden das Ergebnis auch ohne Tests verstehen, wenn Sie wenigstens ein Buch über CPU- und Speicherbetrieb gelesen hätten. Ich habe Ihnen das genialste unter ihnen angeboten, und wenn Sie beim Programmieren ein wenig vorankommen wollen, sollten Sie es unbedingt lesen.

Was haben Arbeitsspeicher und CPU damit zu tun? Es geht um Optimierung, du buchstabierender Theoretiker).

 
Igor Makanu:

es ist nicht seltsam, Sie müssen in der Lage sein, die einfachsten Operatoren und Operationen in MQL zu testen - warum würde ich srand(GetTickCount()) zu meinem Test hinzufügen? ?

;)

Übrigens, schauen Sie genau hin, das Ergebnis in Ihrer Schleife wird in keiner Weise berücksichtigt, was bedeutet, dass es vom Compiler leicht herausgeschnitten werden kann.

 
Alexey Navoykov:

Übrigens, ich habe genau hingesehen, das Ergebnis in Ihrer Schleife wird in keiner Weise berücksichtigt, so dass der Compiler es einfach herausschneiden kann.

Entfernt auch rand() - seine Compiler inlines es perfekt, machte einen solchen Test:

#define  N 8

#define    test(M,S,EX) {                                 \
uint mss=GetTickCount();                                 \
ulong nn=(ulong)pow(10,M);                               \
for(ulong tst=0;tst<nn && !_StopFlag;tst++) \
{ EX; }                                                  \
printf("%s: loops=%i ms=%u",S,nn,GetTickCount()-mss);}
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string s1;  test(N,"1. s1=rand()",s1=(string)tst);
   string s2;  test(N,"2. s2=rand()",s2=(string)tst);
   string s3;  test(N,"3. s3=rand()",s3=(string)tst);
   string s4;  test(N,"4. s4=rand()",s4=(string)tst);
   string s5;  test(N,"5. s5=rand()",s5=(string)tst);

   test(N,"1. q=rand()",string q=(string)tst);
   test(N,"2. q=rand()",string q=(string)tst);
   test(N,"3. q=rand()",string q=(string)tst);
   test(N,"4. q=rand()",string q=(string)tst);
   test(N,"5. q=rand()",string q=(string)tst);
  }
//+------------------------------------------------------------------+

2019.08.18 11:55:41.457 SpeedTest (EURUSD,H1) 1. s1=rand(): loops=100000000 ms=7672

2019.08.18 11:55:49.085 SpeedTest (EURUSD,H1) 2. s2=rand(): loops=100000000 ms=7625

2019.08.18 11:55:56.796 SpeedTest (EURUSD,H1) 3. s3=rand(): loops=100000000 ms=7719

2019.08.18 11:56:04.495 SpeedTest (EURUSD,H1) 4. s4=rand(): loops=100000000 ms=7703

2019.08.18 11:56:12.113 SpeedTest (EURUSD,H1) 5. s5=rand(): loops=100000000 ms=7610

2019.08.18 11:56:17.695 SpeedTest (EURUSD,H1) 1. q=rand(): loops=100000000 ms=5578

2019.08.18 11:56:23.362 SpeedTest (EURUSD,H1) 2. q=rand(): loops=100000000 ms=5672

2019.08.18 11:56:28.970 SpeedTest (EURUSD,H1) 3. q=rand(): loops=100000000 ms=5609

2019.08.18 11:56:34.637 SpeedTest (EURUSD,H1) 4. q=rand(): loops=100000000 ms=5672

2019.08.18 11:56:40.277 SpeedTest (EURUSD,H1) 5. q=rand(): loops=100000000 ms=5640


 
Alexey Navoykov:

Ich will damit sagen, wenn Sie es "richtig" machen wollen, dann gehen Sie zu Assembler. Wenn Sie alles selbst kontrollieren müssen... Der Fall, den Sie gerade beschrieben haben, ist nämlich gar nichts. Es gibt viel kompliziertere Dinge. OOP ist für Sie definitiv kontraindiziert. Sie werden nicht wissen, ob der Compiler eine bestimmte virtuelle Methode zu einem regulären Aufruf degeneriert hat oder nicht, oder ob er eine unnötige Zeigerüberprüfung gestrichen hat... Was kann man in einer verwalteten MQL mit einer solchen Paranoia tun? )

Und den Code auf Kosten der Korrektheit und Zuverlässigkeit des Codes an die Eigenheiten des Compilers (und noch dazu an imaginäre) anzupassen, ist natürlich nicht das, was ein guter Programmierer tun sollte. Und wir sprechen hier von Code-Fehlern. Eine Variable muss direkt in dem Block deklariert werden, in dem sie verwendet wird.

Ha ha ha... Alexey, du behauptest (sagen wir "du"), dass "OOP definitiv kontraindiziert ist" gegenüber einem der wichtigsten OOP-Adepten im Forum.

Der Code sollte nicht an die Eigenheiten des Compilers angepasst werden, sondern an die Eigenheiten des EIGENEN Denkens. In diesem Fall verringert die Deklaration einer Variablen innerhalb einer Schleife theoretisch die Effizienz. Denn gemäß den Konventionen muss die Variable jedes Mal erstellt und jedes Mal zerstört werden.

Es geht nicht einmal um die Frage der Effizienz. Solider Code ist ein Code, der transparent, klar und leicht zu ändern und zu pflegen ist.

Ich persönlich mag es nicht, wenn viele Variablen über das ganze Programm verstreut sind und ich jedes Mal suchen muss, wo eine bestimmte Variable erstellt wird. Daher versuche ich, wenn möglich, die Variablen am Anfang der Funktion zu deklarieren, um zu sehen, wo sie erstellt werden und um zu verstehen, wann sie gelöscht werden.

In diesem Fall ist das Beispiel nur sehr kurz. Wenn zwischen der Erstellung einer Variablen und ihrer Verwendung Dutzende von Zeilen und eine Reihe von verschachtelten Funktionen liegen, ist es meiner Meinung nach viel zuverlässiger, wenn die Variable außerhalb des Blocks, also im Voraus, deklariert wird.

 
pivalexander:

Entschuldigung, die Optimierung wurde in den Projekteinstellungen ausgeschaltet.

Code:


Nicht optimierte

Mit Optimierung

Bei der Optimierung ist das Gegenteil der Fall, ich habe das schon oft überprüft.

In Ihrem Beispiel hätte man den gesamten Schleifenkörper durch Optimierung herausschneiden können.

 

Im Großen und Ganzen kommt alles so zusammen, wie man es erwartet, dass es nicht nötig ist, Unsinn zu machen, nach nicht existierenden Problemen zu suchen und echte Probleme zu schaffen.

Wenn es Sie juckt und Sie sich für einen coolen Hacker halten, schreiben Sie in Assembler, oder lassen Sie den Compiler seine Arbeit machen.

 
Aleksandr Matveev:

In diesem Beispiel hätte man den gesamten Schleifenkörper durch Optimierung herausnehmen können.

Das Ergebnis der Ausführung mit einem leeren Schleifenkörper ist ganz anders, funktioniert aber viel schneller

Без оптимизации:
Test1, время выполнения: 0.027539 сек.

С оптимизацией:
Test1, время выполнения: 0.005448 сек.
 
Alexey Navoykov:

Im Großen und Ganzen kommt alles so zusammen, wie man es erwartet, dass es nicht nötig ist, Unsinn zu machen, nach nicht existierenden Problemen zu suchen und echte Probleme zu schaffen.

Wenn es Sie juckt und Sie sich für einen coolen Hacker halten, schreiben Sie in Assembler, ansonsten lassen Sie den Compiler einfach seine Arbeit machen.

Das Hauptproblem ist eben, dass ich mich nicht als Coolhacker betrachte. Aus diesem Grund sollten Variablen meiner Meinung nach außerhalb der Schleife deklariert werden. Und das am besten gleich zu Beginn der Funktion, auf einmal.

Und nur Koolhousers können Variablen nach Bedarf innerhalb des Codes deklarieren.

 
Georgiy Merts:

Das Hauptproblem ist eben, dass ich mich nicht als Coolhacker betrachte. Aus diesem Grund sollten Variablen meiner Meinung nach außerhalb der Schleife deklariert werden. Und zwar am besten zu Beginn der Funktion und auf einmal.

Koolhacker können Variablen nach Bedarf im Code deklarieren.

Ich ziehe es vor, meinen Code in logische Blöcke aufzuteilen und die dafür benötigten Variablen in diesen Blöcken zu deklarieren, anstatt einen Haufen von Variablen am Anfang einer Funktion zu erstellen, von denen die meisten nur in einem Block, irgendwo weit unten, benötigt werden

Grund der Beschwerde: