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

 
pivalexander:

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

Bei Variablen, die nur an einer Stelle benötigt werden, ist es sinnvoll, sie vor dem eigentlichen Block zu deklarieren, insbesondere wenn der Block klein ist. Aber wenn der Block groß genug ist und die Variablen an anderer Stelle benötigt werden, würde ich es vorziehen, sie am Anfang der Funktion zu deklarieren. Allerdings muss man hier den gesunden Menschenverstand walten lassen.

 
pivalexander:

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

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

Was misst man in Mikrosekunden? .... Sind Sie sicher, dass Sie einen realistischen Test haben?

;)

Hier ist ein weiterer Test wie dieser:

#define  N 8

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

   test(N,"1. q=",string q=(string)tst, result = q;);
   test(N,"2. w=",string w=(string)tst, result = w;);
   test(N,"3. e=",string e=(string)tst, result = e;);
   test(N,"4. r=",string r=(string)tst, result = r;);
   test(N,"5. t=",string t=(string)tst, result = t;);
  }

2019.08.18 12:14:20.765 SpeedTest (EURUSD,H1) 1. s1=: loops=100000000 ms=8156

2019.08.18 12:14:29.127 SpeedTest (EURUSD,H1) 2. s2=: loops=100000000 ms=8359

2019.08.18 12:14:37.353 SpeedTest (EURUSD,H1) 3. s3=: loops=100000000 ms=8235

2019.08.18 12:14:45.464 SpeedTest (EURUSD,H1) 4. s4=: loops=100000000 ms=8109

2019.08.18 12:14:53.557 SpeedTest (EURUSD,H1) 5. s5=: loops=100000000 ms=8094

2019.08.18 12:15:01.446 SpeedTest (EURUSD,H1) 1. q=: loops=100000000 ms=7890

2019.08.18 12:15:09.159 SpeedTest (EURUSD,H1) 2. w=: loops=100000000 ms=7703

2019.08.18 12:15:16.903 SpeedTest (EURUSD,H1) 3. e=: loops=100000000 ms=7750

2019.08.18 12:15:24.716 SpeedTest (EURUSD,H1) 4. r=: loops=100000000 ms=7813

2019.08.18 12:15:32.661 SpeedTest (EURUSD,H1) 5. t=: loops=100000000 ms=7937

 
Igor Makanu:

Was misst man in Mikrosekunden? .... Sind Sie sicher, dass Ihr Test der Realität entspricht?

   ulong  time_finish = GetMicrosecondCount();
   ulong  res = time_finish - time_start;

Daran messe ich es.

 
pivalexander:

Ich messe auf diese Weise.

Das verstehe ich, aber man muss mindestens ein paar Sekunden messen.

Windows ist kein Echtzeitsystem, oder? Und die Hintergrundaufgaben benötigen auch Ressourcen von Windows, so dass Ihre Tests auf der Ebene der Ungenauigkeit des Systemtimers und der Hintergrundprozesse liegen

Imho ist ein Test von mindestens 5 Sekunden zumindest eine zuverlässige Information.

 
Igor Makanu:

Das verstehe ich, aber Sie müssen mindestens ein paar Sekunden messen.

Windows ist kein Echtzeitsystem, richtig? Auch Hintergrundaufgaben benötigen Ressourcen von Windows, so dass Ihre Tests auf der Ungenauigkeit des Systemtimers und der Hintergrundprozesse beruhen

Imho ist ein Test von mindestens 5 Sekunden zumindest eine glaubwürdige Information.

Ich habe jeweils mehrere Sekunden gemessen, das Ergebnis ist dasselbe, warum so lange warten, um das Ergebnis hier zu posten

 

Generell habe ich beschlossen, einen Test zu machen, aber 100% korrekt, so dass nichts herausgeschnitten wurde.

void OnStart()
{
  int count= (int)10 e6;

  { 
    uint t= GetTickCount();
    int sum=0;
        
    for (int i=0; i<count; i++)
    {
       string st = (string)i;
       sum += st[rand()%10];
    }
    Print("Test1, время выполнения: ", GetTickCount()-t," ms,  sum=",sum);
  }
  
  {
    uint t = GetTickCount();
    int sum=0;
    string st = "";
    for (int i=0; i<count; i++)
    {
       st = (string)i;
       sum += st[rand()%10];
    }
    Print("Test2, время выполнения: ", GetTickCount()-t," ms,  sum=",sum);
  }
}

Im nicht-optimierten Modus erweist sich die zweite Variante tatsächlich als schneller, während es im optimierten Modus umgekehrt ist. Die zweite Variante hingegen wird irgendwie langsamer als vor der Optimierung)

 
pivalexander:

Ich habe jeweils ein paar Sekunden lang gemessen, das Ergebnis ist dasselbe, warum also lange warten, um das Ergebnis hier zu veröffentlichen?

und mehrmals der gleiche Test durchgeführt werden muss, weil es eine hohe Wahrscheinlichkeit von Caching-Operationen in den nächsten Test zu bekommen, kann das herauskommen, dass 2 identische Tests mit kleinen Unterschieden unterschiedlich durchgeführt werden - Sie sehen nicht den Unterschied des gleichen Tests?

Wie ich oben schrieb, vertraue ich niemandem, nicht einmal Windows, dem Prozessor und mir selbst ;)


Alexey Navoykov:

Im Allgemeinen beschloss ich, einen Test zu machen, aber 100% richtig, dass nichts herausgeschnitten wurde.

Während im nicht optimierten Modus die zweite Variante tatsächlich schneller ist, verhält es sich im optimierten Modus genau umgekehrt. Und der zweite Weg, aus irgendeinem Grund, wird langsamer als vor der Optimierung)

Es ist keine Tatsache, dass es kein srand() gibt, ich habe dir gesagt, dass rand() sehr cool vom Compiler optimiert ist ;)

Und kopieren Sie den Skripttext mindestens 2 Mal - damit Sie sehen können, was der Compiler abgeschrieben hat ;)

 
pivalexander:

Was haben Arbeitsspeicher und Prozessor damit zu tun? Es geht um Optimierung, Sie sind ein buchhalterischer Theoretiker)

Wenn Sie über die Klammern in Ihrer Argumentation hinausgehen und verstehen, wie ein Compiler arbeitet und wie seine Optimierung funktioniert, werden Sie sehen, dass das Ziel eines jeden Compilers darin besteht, die Anzahl der Taktzyklen bei der Codeausführung zu verringern und die nichtsequenziellen Speicherzugriffe so weit wie möglich zu reduzieren. Dementsprechend wird Ihnen das Ergebnis der Optimierung eines jeden Compilers, falls es existiert, im Voraus bekannt sein, ohne dass Sie irgendwelche dummen Tests durchführen müssen. Das ist so, als würde man mit Tests herausfinden, dass 2 + 2 = 4 ist...

Und über den Buchtheoretiker... Dieser Theoretiker schreibt seit 87, beginnend mit EC1020 und ZX Spectrum, schrieb mehr als einen Compiler und stellte mehr als 600 Programmierer für seine Firma ein...

 
Aleksandr Matveev:

Wenn Sie über die Klammern in Ihrer Argumentation hinausgehen und verstehen, wie der Compiler arbeitet und wie seine Optimierung funktioniert, werden Sie sehen, dass das Ziel eines jeden Compilers darin besteht, die Anzahl der Taktzyklen bei der Codeausführung und die nichtsequenziellen Speicherzugriffe so weit wie möglich zu reduzieren, und folglich werden Sie das Ergebnis der Optimierung eines jeden Compilers, falls es existiert, im Voraus kennen, ohne irgendwelche dummen Tests. Das ist so, als würde man mit Tests herausfinden, dass 2 + 2 = 4 ist...

Und über den Buchtheoretiker... Dieser Theoretiker arbeitet seit 87, als er mit EU1020 und ZX Spectrum zu arbeiten begann, mehrere eigene Compiler schrieb und mehr als 600 Programmierer in seine Firma einlud...

Ihr seid mit Büchern beschäftigt, lobt euch selbst, aber sie sagen nichts über den Kern des Problems aus, sie tanzen nur um die Theorie herum... Wenn ihr dies lest, werdet ihr es verstehen... Speicher und CPU, CPU und Speicher, dort wird auch die Stromversorgung verwendet ...

 
Wussten Sie, dass eine Zeichenkette einen kleinen internen Puffer haben kann und dass bei kleinen Zeichenketten die Daten vollständig dorthin gelangen können? Sozusagen, um die meisten trivialen Fälle zu beschleunigen. Beim Herumspielen mit malloc() ist mir aufgefallen, dass malloc überhaupt nicht zappelt, wenn die Zeichenkette kürzer als etwa 15 Zeichen ist. Wie würden Ihre Tests ...