Frage an #define-Experten - Seite 11

 
Igor Makanu:

wenn physisch im CPU-Befehl, nein

ein Array ist ein Speicherbereich, der Zugriff auf Array-Elemente besteht darin, den Index eines Elements vom Anfang dieses Speicherbereichs aus zu berechnen und Daten (Bytes) entsprechend dem gespeicherten Typ abzurufen


wenn dies die Logik des Algorithmus ist, dann ja, es sind indizierbare Variablen.

Im Allgemeinen ist der einzig richtige Ratschlag zu dem untersuchten Problem: https: //www.mql5.com/ru/forum/354662/page4#comment_19039624:

     {
      for(int i=0; i<ArraySize(mas); i++)
        {  
        r2+=ArraySize(mas);
        r2|=ArraySize(mas); 
        }

     }  
   ulong t2=GetMicrosecondCount();
   //for(ulong z=0; z<max; z++)
   int sizem=ArraySize(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        if (r2>10) r2|=sizem; 
        }
     } 

Die Ausführungszeit einer binären Operation ist um ein Vielfaches schneller als die Ausführungszeit einer if-Anweisung (sollte es auch sein) .... Sieht aus wie hinter den Kulissen entweder sauber oder super schnell nativen Code

Die Zeit des oberen ist halb so lang wie die des unteren.


Nun, technisch gesehen haben wir zwei Variablen verglichen))

 
Alexandr Andreev:

Die Ausführungszeit einer binären Operation ist um ein Vielfaches schneller als die Ausführungszeit einer if-Anweisung (so sollte es auch sein) ....

es sollte kein if() in Schleifen geben, früher wurde die Schleife durch das CX-Register ausgeführt

Alexandr Andreev:

Die Zeit des oberen ist halb so lang wie die des unteren

Ich diskutiere nicht, ich habe am Morgen noch einmal getestet, die Zeitoptimierung funktioniert immer in MQL5, das Ergebnis hängt von der Anzahl der Schleifen ab, auch davon, welcher Test zuerst aufgerufen wurde - ich werde es nicht noch einmal testen, es ist Zeitverschwendung

 
Igor Makanu:

in Schleifen sollte es kein if() geben, bevor die Schleife von CX case ausgeführt wurde

Ich diskutiere nicht, ich habe am Morgen wieder getestet, die Zeitoptimierung funktioniert immer in MQL5, das Ergebnis hängt von der Anzahl der Schleifen ab, gut, welcher Test zuerst aufgerufen wurde, ich werde es nicht wieder testen, es ist Zeitverschwendung

.... Sie müssen auf Ihre Beiträge achten)))) der Beitrag oben bezieht sich auf den Beitrag, der vorschlägt, dass der ArraySize-Operator auf Überläufe prüft (DIES ist Ihr wenn) und es ist durch Hinzufügen zum Körper, dass Sie wirklich prüfen, und dies ist der einzig richtige Weg.

Und der Unterschied zur ersten Version liegt nur in Ihren Tests)

 
Alexandr Andreev:

Und der einzige Unterschied zur ersten Version besteht in den Tests)

Geben Sie mir Ihren Test, dann sehen wir weiter.

obwohl... Nicht nötig, ich beteilige mich an der Diskussion über Automatismus, Sie mögen es, ich bin anderer Meinung über die Verwendung von ArraySize() in der Schleifenabbruchbedingung

 

.ex5 Abmessungen

void OnStart() // размер 12 272 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = ArraySize(arr) - 1; i >= 0; i--)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер 11 860 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0; i < ArraySize(arr) - 1; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
//+------------------------------------------------------------------+
void OnStart() // размер  12 174 байт
{
   int arr[];
   ArrayResize(arr, 100);
   ArrayInitialize(arr, 1);
   int sum = 0;
   for(int i = 0, sz = ArraySize(arr); i < sz; i++)
   {
      sum += arr[i];
   }
   printf("sum = %i", sum);//sum = 100
}
 
Wer weiß das schon, außer den Compilerherstellern? Vielleicht funktioniert ArraySize() genauso wie eine Variablenreferenz. Das scheint möglich.
 
Dmitry Fedoseev:
Und wer weiß das schon, wenn nicht die Schöpfer des Compilers? Vielleicht funktioniert ArraySize() genauso wie die Adressierung einer Variablen. Das scheint möglich.
void OnStart()
  {
   int mas[];  
   int size=1000000000;
   ArrayResize(mas,size); 
   int r2=0; 
   int tr=0;  
    int num_steps=ArraySize(mas); 
    double step = 1.0/(double)num_steps;
    
     int v=size;
    ulong t1 = GetMicrosecondCount();
    
  // for(ulong z=0; z<max; z++)
  
   int sizem=Size(mas);
     {
      for(int i=0; i<sizem; i++)
        { 
        r2+=sizem;
        r2|=sizem; 
        }
     } 
   ulong t2=GetMicrosecondCount(); 
     {
      for(int i=0; i<Size(mas); i++)
        {  
        r2+=Size(mas);
        r2|=Size(mas); 
        } 
     }  
   ulong t3=GetMicrosecondCount();
   
  Print(t2-t1," ",t3-t2," ",r2) ; 
  }
 
int Size(int &mas[]){return Size2(mas);} 
int Size2(int &mas[]){return Size3(mas);} 
int Size3(int &mas[]){return ArraySize(mas);} 

Bitte beachten Sie, dass hier der Test zwischen der Funktion, die die Funktion aufruft, die ArraySize aufruft und die Geschwindigkeit die gleiche ist, was nur auf eine Variable zugreifen. Weil der Compiler sie einfach entfaltet

ArraySize

der Verwendung von ArraySize() in der Schleifenabschlussbedingung


und es gibt keinen Unterschied zur Umstellung von
Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 

ein weiterer Test von the_bald....

Warum testen Sie Ihre Kreation nur einmal?

Testen Sie es mindestens zehnmal, um zu sehen, was passiert.

eingebettet in externen Schleifencode, Ergebnis:

HQ 0 15:26:55.230 tst (EURUSD,H1) 558620 543908 -512

RO 0 15:28:08.672 tst (EURUSD,H1) 544176 543129 -512

EF 0 15:28:09.759 tst (EURUSD,H1) 544139 543144 -512

RM 0 15:28:10.847 tst (EURUSD,H1) 544174 543436 -512

GD 0 15:28:11.934 tst (EURUSD,H1) 543668 543531 -512

CR 0 15:28:13.021 tst (EURUSD,H1) 543413 543097 -512

JI 0 15:28:14.107 tst (EURUSD,H1) 543046 543218 -512

HP 0 15:28:15.194 tst (EURUSD,H1) 543337 543469 -512

PO 0 15:28:16.282 tst (EURUSD,H1) 543602 544455 -512

KE 0 15:28:17.369 tst (EURUSD,H1) 543253 543197 -512

CL 0 15:28:18.457 tst (EURUSD,H1) 544199 543664 -512

Ich werde die getesteten Schleifen nicht neu anordnen, ich habe mich mit ihnen gelangweilt - die Codegröße oben, es bedeutet eine gute Optimierung, vielleicht mit dem Code-Analysator, letztes Jahr war ich überrascht, in iCustom Optimierung für MQL4 - 4 Anrufe von 4=x Indikatorpuffern sind mit einem Aufruf ersetzt, gab es ein Thema irgendwo, wieder über Effizienz

Im Allgemeinen hat Metacquotes gute Arbeit bei der Analyse von Typcodes von Benutzern geleistet, d.h. der Compiler wird die meisten Sachen der Benutzer von selbst korrigieren... cool, imho!

 

Entschuldigung, ich könnte mich irren. Ich habe es nicht ganz gelesen. Nur die erste Seite. Der Eindruck ist der übliche. Jemand stellt eine konkrete Frage. Und dann kommen die Überschwemmungsgebiete ins Spiel.

Nochmals Entschuldigung, ist dies wirklich ein Entwicklerforum ?????

 
Сергей Таболин:

Entschuldigung, ich könnte mich irren. Ich habe es nicht ganz gelesen. Nur die erste Seite. Der Eindruck ist der übliche. Jemand stellt eine konkrete Frage. Und dann kommen die Überschwemmungsgebiete ins Spiel.

Nochmals Entschuldigung, ist dies wirklich ein Entwicklerforum ?????

Falsch, dort wurden auch andere Fragen gestellt, die sich von denen von TC unterscheiden. Und manchmal hilft es, die Grundsätze der Kompilierung zu verstehen.