Merkmale der Sprache mql5, Feinheiten und Techniken - Seite 237

 
Alain Verleyen #:

Vielleicht übersehe ich etwas, aber ich habe Ihr Skript verwendet, um (nur) PeriodSeconds zu überprüfen.


meine Ergebnisse aus Ihrem Test:

2023.11.15 00:26:58.896 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.78 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:26:59.056 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 16.03 наносекунд - PeriodSecondsFast
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.08 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:26:59.477 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:16.018 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:16.318 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 29.99 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:16.474 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.59 наносекунд - PeriodSecondsFast
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.74 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:16.901 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:25.206 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:25.508 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.14 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:25.666 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.77 наносекунд - PeriodSecondsFast
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 44.47 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:26.110 DDD__ (EURUSD,M1)       ========================================================================
2023.11.15 00:27:40.780 DDD__ (EURUSD,M1)       =====LOOP=10000000
2023.11.15 00:27:41.089 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 30.90 наносекунд - PeriodSecondsFastFXS
2023.11.15 00:27:41.249 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 15.98 наносекунд - PeriodSecondsFast
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       контрольная сумма - 34192800000000, время выполнения 1 иттерации = 42.72 наносекунд - Расчет через PeriodSeconds
2023.11.15 00:27:41.676 DDD__ (EURUSD,M1)       ========================================================================

0 errors, 0 warnings, 234 msec elapsed, cpu='AVX2 + FMA3'               


Der Test selbst gefällt mir nicht besonders gut, weil 10 Millionen der gleichen Berechnungen in dem Test stattfinden. In diesem Fall gibt es keine Garantie, dass der Compiler bei seinen Versuchen, den Code zu optimieren, keine Überraschungen erlebt.
Und diese Werte müssen durch 21 geteilt werden, weil es insgesamt 21*10 000 000 Iterationen gibt.

Aber auch dieser Test bestätigt meine Schlussfolgerungen, allerdings für meinen Prozessor, der frischer zu sein scheint und daher die modernen Leistungsmerkmale maximal nutzt und daher objektiver ist, weil er aktueller ist.


Es wäre interessant, die Ergebnisse dieses Tests für andere zu sehen.

 
fxsaber #:

Ich habe mir das Format angesehen.

Wahrscheinlich wird es nicht schneller werden. Habe aber von der wundersamen Geschwindigkeit der Umstellung gehört.

Ein spärlicher Schalter bringt keine wundersame Geschwindigkeit.

Die wunderbarste Geschwindigkeit bietet ein Schalter mit Werten von Null bis 255 in Schritten von 1

 
Slava #:

Ein spärlicher Schalter bringt keine großartige Geschwindigkeit.

Am schnellsten geht es bei einem Schalter mit Fällen von Null bis 255 in Schritten von 1

Ich danke Ihnen.

 
Nikolai Semko # :

meine Ergebnisse aus Ihrem Test:



Der Test selbst gefällt mir nicht besonders gut, weil in dem Test 10 Millionen der gleichen Berechnungen stattfinden. In diesem Fall gibt es keine Garantie, dass der Compiler bei seinen Versuchen, den Code zu optimieren, keine Überraschungen erlebt.
Und diese Werte sollten durch 21 geteilt werden, da es insgesamt 21*10 000 000 Iterationen gibt.

Aber auch dieser Test bestätigt meine Schlussfolgerungen, allerdings für meinen Prozessor, der frischer zu sein scheint und daher die modernen Leistungsmerkmale maximal nutzt und daher objektiver ist, weil er aktueller ist.


Es wäre interessant, die Ergebnisse dieses Tests für andere zu sehen.

Danke!

Es war gestern spät, als ich die Ergebnisse OHNE Compiler-Optimierung veröffentlichte.

Hier sind die Ergebnisse mit cpu='AVX2 + FMA3' und maximaler Optimierung.


 
Nikolai Semko #:

Die Hauptschwierigkeit bei diesem Algorithmus ist die Berechnung der Anfangszeit des Monats (grün hervorgehoben).

Das Interessanteste an diesem Code, das in der Diskussion kaum erwähnt wurde.

 
fxsaber #:

Die interessanteste Sache im Kodex, die in der Diskussion fast nicht angesprochen wurde.

Dort beginnt das Jahr am 1. März und nicht am 1. Januar.
Das ist ein Tipp, den ich auf Stackoverflow gesehen habe. Es war ein guter Ratschlag.
Ich musste ein Skript schreiben, um den Faktor 30,68 zu finden
 

Ich sah mich mit der Notwendigkeit konfrontiert, sehr kurzen Code (< 15 Zeilen) in Form von mqh-library zu speichern.

template <typename T1, typename T2>
T1* New( const string &ClassName ) { return((typename(T2) == ClassName) ? new T2 : NULL); }

template <typename T1, typename T2>
T1* New( string ClassName, const T2 &FuncNew[] )
{  
  T1* Res = NULL;
  
#ifdef __MQL5__
  ClassName = "class " + ClassName;
#endif // #ifdef __MQL5__
  
  for (uint i = ArraySize(FuncNew); (Res == NULL) && (bool)i--;)
    Res = FuncNew[i](ClassName);  
    
  return(Res);
}

Es ist eine Zwangsmaßnahme, weil Zeiger auf Funktionen nur für Funktionen aus dem globalen Scopus möglich sind.

Wie kurze Bibliotheken verwenden Sie?

 
Die Signatur einer Vorlagenfunktion kann von den Stellen ihres Aufrufs abhängen.

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Fehler, Bugs, Fragen

fxsaber, 2023.11.26 23:26

template <typename T>
void Func( void ) { Print(__FUNCSIG__); }

void OnStart()
{
  Func<int>(); // void "void OnStart()"::Func<int>()
}
 

Wenn ich es richtig verstehe, wird in diesem Fall die Methode A::f() in g() eingefügt.

class A
{
  void f() {}
  void g() { this.f(); }
};


Und hier ist sie es nicht.

class A
{
  virtual void f() {}
  void g() { this.f(); }
};


Wird A::f() im zweiten Fall vom Compiler inlined, vorausgesetzt, dass nirgendwo im Code nachkommende Objekte der Klasse A erzeugt werden?

 
Manchmal muss man einen Haltepunkt an einer bestimmten Stelle im Visualiser setzen. Ich verwende eine solche Funktion für diesen Zweck.
bool IsManualChangeTester()
{
  static const bool IsVisual = MQLInfoInteger(MQL_VISUAL_MODE);
  static ENUM_CHART_MODE PrevChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);  
  
  bool Res = false;
  
  if (IsVisual)
  {
    const ENUM_CHART_MODE ChartMode = (ENUM_CHART_MODE)ChartGetInteger(0, CHART_MODE);
      
    if (Res = (ChartMode != PrevChartMode))
      PrevChartMode = ChartMode;
  }
    
  return(Res);
}


Mit dieser Anwendung.

if (IsManualChangeTester())
  DebugBreak();


Wenn ich diese Bedingung erstellen muss, ändere ich einfach den Anzeigemodus des Diagramms im Visualisierer.

Und dann analysiere ich das Verhalten des Expert Advisors in ME.