Pracht und Armut der PLO - Seite 5

 
meat:

Hier wird der Index, so wie ich es verstehe, über eine binäre Suche definiert?

Nein, direkter Zugriff wie bei einem Array.

__________

Vielleicht habe ich mich geirrt, ich werde darüber nachdenken.

Im Allgemeinen hindert Sie niemand daran, ein Array für die gesamte Größe des Typs zu erstellen und ständig Zugriff darauf zu haben. (Schalter funktioniert nur bei integralen Typen).

In dem von Ihnen beschriebenen Fall ist es bequemer, eine Aufzählung einzugeben.

 
TheXpert:

Nein, direkter Zugriff wie bei einem Array.

__________

Vielleicht habe ich überreagiert, ich werde es mir noch einmal überlegen.

Eigentlich hindert Sie niemand daran, ein Array für die gesamte Größe des Typs zu erstellen und konstanten Zugriff zu erhalten. (Der Schalter funktioniert nur bei integrierten Typen).

In dem von Ihnen beschriebenen Fall wäre es sinnvoller, eine Aufzählung zu erstellen.

Für den gesamten Wert des Typs? Niemals! In diesem Fall werden 16 Gb Speicher benötigt (für ein Array vom Typ int). Und was bringt es, den ganzen Wert zu nehmen? Es genügt, die Differenz zwischen Maximal- und Minimalwert zu berechnen. Aber das ist ohnehin ein fragwürdiger Fall, denn bei großen Werten müssen wir erst mit dem Benutzer aushandeln, wie viel Speicher er für das Programm zur Verfügung stellen will. Deshalb eignet sich diese Methode nur für kleine Schlüsselwerte (bzw. für eine kleine Differenz zwischen Maximal- und Minimalwert). Damit bleibt nur noch die binäre Suche.

 
meat:

Damit bleibt nur noch die binäre Suche.

Nein, das ist wirklich nicht nötig. Kurz gesagt, wenn Sie eine Zahl auf eine Zahl abbilden müssen, brauchen Sie eine binäre Suche. Wenn es ausreicht, mit einer Zahl zu arbeiten und die Zahl auf eine Zahl abzubilden, dann brauchen Sie eine konstante Suche.

Ich verstehe das mit dem Gedächtnis )), deshalb habe ich geschrieben, dass ich es übertrieben habe.

 

Es bleibt immer Raum für die Frage - Warum? Vergleichen Sie die Streutabelle online und im Tester. Der Tester hat nichts mit der Realität zu tun...

tol64:

Haben Sie bereits irgendwo eine ausführlichere Erklärung (Beweis) abgegeben?

Sie müssen Ihre Behauptungen mit Beweisen untermauern, sonst werden Sie sie nicht einmal zur Kenntnis nehmen. ;)

 
C-4:
Leute, lest die Dokumentation des Schalters. Ein guter Schalter ist ein geschalteter Übergang, dessen Leistung nicht von der Anzahl der Wahlmöglichkeiten abhängt. 1 Wahl, 100 oder 1000 - die Übergangsrate wird konstant sein.
Wah danke, gute Referenz, habe es mit Vergnügen und Nutzen gelesen.
 
dimeon:

Es bleibtimmer Raum für die Frage - Warum? Vergleichen Sie die Streutabelle online und im Tester. Der Tester hat nichts mit der Realität zu tun...

Um Aufmerksamkeit zu erregen. Eröffnen Sie ein neues Thema und behandeln Sie Ihre Frage ausführlicher. Zeigen Sie, wie in der Realität und wie im Testgerät. Bieten Sie Ihre Lösung für dieses Problem an. Andernfalls bleibt sie "ohne Chance und ohne Optionen". )
 
Vinin:

Der Beweis wird von der anderen Seite kommen. Oder wieder nur Worte.

Im Großen und Ganzen bin ich nur an Fakten interessiert.

Ich weiß zwar schon, dass OOP langsamer ist, aber es bietet ganz konkrete Annehmlichkeiten.

Wie versprochen, stelle ich hier die Ergebnisse eines Projekts vor. (Bitte verzeihen Sie mir, aber einige Funktionen sind geschwärzt, da der Code nicht für die Allgemeinheit bestimmt ist).

Zu Beginn möchte ich sagen, dass es sich um ein echtes OOP-Projekt handelt, mit starker Transformation der Quelldaten. Die Idee, OOP darin zu verwenden, wird auf die Spitze getrieben. So werden zum Beispiel keine globalen Variablen, Arrays oder Funktionen außerhalb von Klassen verwendet, weil sie nicht OOP genug sind. Damit dies funktioniert, benötigen wir die Historie der Aufträge und Geschäfte, die über den gesamten Zeitraum hinweg getätigt wurden. Das Parsing von 6014 Geschäften und 6599 Aufträgen dauert nur 3,1 Sekunden oder 0,25 Millisekunden pro Transaktion, und der Arbeitsspeicher zur Bereitstellung aller Geschäfte, Aufträge und Positionen benötigt etwa 13 MB oder durchschnittlich 1 Kilobyte pro Transaktion. - Ich denke, das ist ein sehr gutes Ergebnis für eine OOP-Anwendung:

2014.07.07 12:44:33.464 TestMA (AUDCAD,H1) Wir sind am Anfang. Die Analyse der historischen Geschäfte (6014) und Aufträge (6599) wurde in 3,104 Sekunden abgeschlossen. 13MB RAM verwendet.

Schauen wir uns jedoch die Struktur der Zeit an, die für die Initialisierung der Anwendung benötigt wird:

Wir sehen, dass die meiste Zeit auf den Aufruf der Funktion AddNewDeal verwendet wird. Dies ist eine zusammengesetzte Funktion, und die eigentliche Arbeit wird an RecalcValues (57 %) delegiert. Sie besteht wiederum aus Systemfunktionen wie HistoryOrderGetInteger:

Beachten Sie, dass die Aufrufzeiten dieser Funktionen ungefähr gleich sind.

Beachten Sie, dass dies das Ende der gesamten Funktionsförderung ist. Bevor Sie zu diesen Berechnungen kommen, müssen Sie ein weiteres Dutzend von OOP-Zwischenmethoden durchlaufen, von denen einige ebenfalls virtuell sind. Ihre Laufzeit ist jedoch vernachlässigbar und im Profiler stehen sie in der zweiten Hälfte der Liste.

Da es sich um eine 100%ige OOP-Anwendung handelt, ist es für mich sehr einfach, die zeitkritischen Codeabschnitte zu verfolgen, und ich kann sehr effektiv neue Wege zur Leistungssteigerung finden. Ich weiß bereits, dass der verbleibende Teil (43 %) zu 80-90 % aus Aufrufen von CArray.Resize() besteht. Es gibt einige Stellen, an denen der Code nicht optimiert ist und Array-Repartitionierung häufiger als nötig auftritt. Ich könnte diese OOP-Module leicht neu schreiben und die Leistung um 25-30 % verbessern. Ohne OOP wäre dies schwieriger zu bewerkstelligen, da jede Funktion potenziell in eine unendliche Anzahl von Wechselbeziehungen eingebunden ist und es viel schwieriger wird, die Folgen von Änderungen in einer solchen Funktion zu berechnen.

Als Ergebnis stellt sich heraus, dass selbst ein komplexes OOP-Projekt an die Leistungsgrenze der grundlegenden Systemfunktionen gebracht werden kann. Aber ohne OOP wird es schwieriger sein, eine solche Produktivität zu erreichen, weil es so viele Funktionen gibt, dass man früher oder später einen Fehler macht: Man macht entweder unnötige Aufrufe oder nicht optimierte Zwillinge oder zu komplexe und umständliche Implementierungen.

 
dimeon:

Es bleibt immer Raum für die Frage - Warum? Vergleichen Sie die Streutabelle online und im Tester. Im Testgerät hat es nichts mit der Realität zu tun...

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Glanz und Elend von OOP

tol64, 2014.07.07 09:12

Um Aufmerksamkeit zu erregen. Eröffnen Sie ein neues Thema und behandeln Sie Ihre Frage ausführlicher. Zeigen Sie, wie es im wirklichen Leben aussieht und wie es im Testgerät aussieht. Schlagen Sie Ihre eigene Lösung für dieses Problem vor. Andernfalls bleibt sie "ohne Chance und ohne Optionen". )

+++

zudimeon - Öffnen Sie einen Thread, Sie werden viele Argumente erfahren, warum es nicht geht und warum es gehen sollte.

 
C-4:

Wie versprochen, veröffentliche ich die Ergebnisse der Profilierung eines Projekts. (Nichts für ungut, aber einige Funktionen sind maskiert, da der Code nicht für die Allgemeinheit bestimmt ist).

...

Warum das alles? Du hast keine Codes deiner Funktionen zitiert (wenn man von einigen zerrissenen Fragmenten absieht). Worüber soll man also diskutieren? Hier im Thread geht es speziell um den Vergleich der Leistung von OOP und prozeduraler Programmierung. Und die Tatsache, dass Ihre geheimen Funktionen angeblich Arbeit erledigen, irgendwo etwas delegieren, sich Zeit nehmen, und Sie all das meisterhaft erledigen - natürlich freuen wir uns unglaublich für Sie, aber was nützt uns diese Information, wenn wir die Codes nicht sehen.

 
meat:

Was soll das alles? Sie haben keine Codes Ihrer Funktionen zitiert (es sei denn, Sie zählen ein zerrissenes Fragment). Was gibt es also zu diskutieren? Hier geht es speziell um den Vergleich der Leistung von OOP und prozeduraler Programmierung. Und die Tatsache, dass Ihre geheimen Funktionen angeblich Arbeit erledigen, irgendwo etwas delegieren, sich Zeit nehmen, und Sie das alles meisterhaft bewältigen - natürlich freuen wir uns unglaublich für Sie, aber was nützt diese Information, wenn wir die Codes nicht sehen.

Er zeigte, dass direkte oder virtuelle Anrufe bei realen Projekten keine Wirkung haben.

Am Beispiel des Profils eines realen OOP-Projekts werde ich zeigen, dass die Leistung an der Grenze zur Leistung der Systemfunktionsaufrufe tendiert

Der größte Teil der Kosten entsteht beim Aufruf von Systemfunktionen, wo MQL-Programme die meiste Zeit verbringen. Die Kosten für die Vermittlung der Anrufe sind im Vergleich zur Nutzlast vernachlässigbar.