Diskussion zum Artikel "Statistische Verteilungen in MQL5 - Nur das Beste aus R" - Seite 7
Sie verpassen Handelsmöglichkeiten:
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Registrierung
Einloggen
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Wenn Sie kein Benutzerkonto haben, registrieren Sie sich
Ich spreche über R, aber mein Wissen ist veri klein)) kann jemand überprüfen, ob der Code korrekt ist?
Wenn der Code korrekt ist, können Sie den Benchmark überprüfen?
Der Code ist falsch.
Sie haben die Kompilierungszeit der Funktion gemessen, nicht ihre Ausführung:
Die Funktion cmpfun kompiliert den Rumpf einer Closure und gibt eine neue Closure mit denselben Formeln zurück, wobei der Rumpf durch den kompilierten Rumpfausdruck ersetzt wird.
Der Beweis für den Fehler:
> library(microbenchmark) > library(compiler) > n <- 2000 > k <- seq(0,n,by=20) > qqq<- function(xx) { a <- dbinom(k, n, pi/10, log = TRUE) } > res <- microbenchmark(cmpfun(qqq)) > a Ошибка: объект 'a' не найденWenn die Funktion qqq während des Benchmarks ausgeführt worden wäre, hätte das Objekt a die berechneten Daten erhalten. Stattdessen stellte sich aber heraus, dass das Objekt gar nicht erstellt wurde.
Folglich zählte der Benchmark die Kompilierungszeit statt der Ausführungszeit. In meinem Code ist alles korrekt - der Benchmark zählt die tatsächliche Ausführungszeit und Objekt a wird mit den richtigen Daten erstellt.
Und ja, die Kompilierung ist ein ziemlich aufwendiger Prozess: Sie wird in Millisekunden statt in Mikrosekunden angegeben.
Und ein weiterer Witz ist, dass Sie in Ihrem Beispiel die Systemfunktion q() - quit - außer Kraft gesetzt haben.
Es gab keine Möglichkeit, R zu beenden :)
Ich meine, dass der mql-Compiler alle Eingabeparameter bereits zur Kompilierungszeit kennt. Es reicht aus, wenn er alles während der Kompilierung berechnet, und wenn er das Skript aufruft, gibt er einfach das vorberechnete Ergebnis zurück. Ich habe einige Artikel im Hub gesehen, in denen C++-Compiler verglichen wurden, und nach der Analyse des Assembler-Codes zu urteilen, passiert dort genau das.
Ja, er könnte es aktiv nutzen. Hier sind einige Beispiele: https://www.mql5.com/ru/forum/58241.
Aber in diesem Fall wird es nicht funktionieren - Sie müssen wegen der Komplexität, der Schleifen- und Array-Füllung vollständig zählen.
wenn der Code korrekt ist, können Sie den Benchmark überprüfen?
Sie müssen res <- microbenchmark(cmpfun ( q)) mit res <- microbenchmark(q())) ersetzen . Aber zuvor kompilierte Bibliotheken werden nicht in Bytecode umkompiliert, ich habe die gleichen Ergebnisse erhalten.
qqq<- function(xx) { a <- dbinom(k, n, pi/10, log = TRUE) }"a" wird in diesem Fall eine lokale Variable sein, auf die außerhalb der Funktion selbst sowieso nicht zugegriffen werden kann. Aber man kann es auch so machen -
a <<- dbinom(k, n, pi/10, log = TRUE)
dann wird es eine globale Variable sein.
Aber in diesem Fall wird es nicht funktionieren - man muss wegen der Komplexität, der Schleife und dem Füllen des Arrays vollständig zählen.
Verstehe, die Ausführungsgeschwindigkeit ist also ausgezeichnet
Übrigens kostet es praktisch nichts, den primitiven Aufruf a <- dbinom(k, n, pi/10, log = TRUE) mit einem direkten Fall in den R-Kernel mit nativer Ausführung zu interpretieren(dbinom ist in r.dll).
Der Versuch, diesen Aufruf zu kompilieren, ist also offensichtlich sinnlos.
Da ich schon oft über die Schnelligkeit von R geschrieben habe, möchte ich meine fünf Cent dazugeben.
Lieber Renat!
Dein Beispiel ist überhaupt nichtssagend!
Du hast zwei ähnliche Funktionen genommen und daraus einen Rückschluss auf die Leistungsfähigkeit von R gezogen.
Die Funktionen, die du genannt hast, repräsentieren überhaupt nicht die Leistungsfähigkeit und Vielfalt von R.
Sie sollten rechenintensive Operationen vergleichen.
Zum Beispiel die Matrixmultiplikation...
Lassen Sie uns den Ausdruck in R messen
c <- a*b,
wobei a und b Matrizen mit einer Größe von mindestens 100*100 sind. Stellen Sie in Ihrem Code sicher, dass R die MKL von Intel verwendet. Dazu müssen Sie lediglich die entsprechende Version von R installieren.
Wenn wir uns R ansehen, gibt es Berge von Code, der rechenintensive Operationen enthält. Um diese auszuführen, werden Bibliotheken verwendet, die im Moment die effizientesten sind.
Und der Nutzen von R für den Handel liegt nicht in den Funktionen, die Sie umgeschrieben haben (obwohl sie auch notwendig sind), sondern in den Modellen. In einer meiner Antworten an Sie habe ich das Caret-Paket erwähnt. Sehen Sie, was es ist.... Die Implementierung jedes praktisch nützlichen Handelsmodells im Rahmen dieses Pakets und auf µl wird Ihnen die Antwort geben
Außerdem sollten Sie nicht vergessen, dass das Laden aller Kerne eines Comps eine Routine für R ist. Darüber hinaus können Sie benachbarte Comps im lokalen Netzwerk laden.
PS.
Die Idee, die Leistung von MKL und R zu vergleichen, halte ich für fragwürdig: Diese beiden Systeme haben völlig unterschiedliche Themenbereiche
SanSanych, wir werden alles testen und einen Benchmark veröffentlichen. Aber zuerst werden wir die Funktionalität vervollständigen.
Der Test war gerechtfertigt und hat das Problem sofort aufgedeckt. Ich habe die theoretische Begründung dargelegt und bin sicher, dass der System-Overhead von R bei der überwältigenden Menge an Funktionalität erhalten bleibt.
Wir können die Matrizen so multiplizieren, dass Intel verlieren wird. Das ist längst keine Raketenwissenschaft mehr, und Intel (oder besser gesagt, solche Drittprogrammierer innerhalb der Firmenzugehörigkeit) ist kein Meister im mythischen Wissen über seine Prozessoren.
Da ich schon oft über die Schnelligkeit von R geschrieben habe, möchte ich meine fünf Cent dazugeben.
.................
An San-Sanych und die anderen Jungs.
San-Sanych, du weißt, wie sehr ich dich respektiere ... ((S) Kataev und Feinzilberg, bekannt als "Ilf und Petrov"), trotz einiger Ihrer post-sowjetischen Witze hier.
Lassen Sie mich etwas Wichtiges für Sie klarstellen:
1). Die Hauptaufgabe eines Programmierers ist nicht das Schreiben von Programmen, sondern das LESEN von Programmen, insbesondere von seinen eigenen. Jeder Programmierer 95...99% seiner Zeit sitzt er da und starrt auf den Monitor. Schreibt er ein Programm? Nein, er liest es meistens. Je näher das, was er auf dem Bildschirm liest, an der natürlichen Sprache ist, d.h. an dem, was ihm von seiner Mutter, seinem Vater, seiner Großmutter, seinem Lehrer beigebracht wurde, desto effizienter wird er diese sprachlichen Krakozebras auf dem Bildschirm entschlüsseln und die Entsprechung zwischen dem Algorithmus und seinem Programm finden.
2). Für die Zwecke von Punkt (1) gibt es im Durchschnitt nichts Besseres als die Sprache C. Deshalb habe ich persönlich (sowie 2-3 verantwortliche und weniger verantwortliche Leute) es zum Beispiel geschafft, ein Projekt mit 700+ Unterprogrammen in C, MQL4, CUDA..... zu schreiben. Und alles funktioniert.
3). Aus der Sicht von Punkt (1) ist die objektorientierte Variante von C, d.h. C++, viel schlechter. (Aber dazu ein andermal mehr).
4). Die volle Kompatibilität von klassischem C und MQL4 ist einfach unbezahlbar. Die Übertragung einer Prozedur hin und her dauert eine halbe Minute.
5). Der Hauptvorteil von C+MQL4 ist die KLARHEIT. Das heißt, die Verständlichkeit und Transparenz von allem, was sich auf dem Bildschirm des Programmierers befindet.
Wenn wir C-MQL4 mit Ihrem R vergleichen, sollten wir nicht auf die Geschwindigkeit und den Umfang des geschriebenen Codes achten, sondern auf die KLARHEIT des Textes. Das heißt, seine Verständlichkeit. Andernfalls wird der Programmierer 24 Stunden lang auf den Bildschirm starren und vergeblich versuchen zu verstehen, was das Programm tut, welche Parameter es hat, warum der Autor sie so benannt hat und ganz allgemein, warum der Programmierer es so und nicht anders gemacht hat. Es ist nicht die Geschwindigkeit des Programms, die hier wichtig ist, sondern die Korrektheit seiner Arbeit und die Geschwindigkeit seiner ANWENDBARKEIT für den Endprogrammierer.
Unter diesem Gesichtspunkt ist das, was Metaquotes getan hat, natürlich eine großartige Unterstützung für diejenigen, die Statistiken in ihre EAs einfügen wollen. Es gibt nichts Vergleichbares in Bezug auf die Einfachheit und Verständlichkeit der Funktionen. Und das ist wichtig. Vor allem, wenn Sie heikle Berechnungen haben (und Forex und der Handel im Allgemeinen erfordern heikle Berechnungen).
Lassen Sie uns vergleichen.
Hier sehen Sie, wie die Integrationsfunktion in C - MQL4 aussieht:
Ich schreibe in Teilen, so ist es einfacher zu schreiben.
Es ist eine trapezförmige Integrationsfunktion enthalten:
Alles ist absolut klar und verständlich. Und was wichtig ist, es funktioniert immer und funktioniert gut, d.h. mit geringen Fehlern auch in MT4-MQL4, was eine Menge Zeit spart.
Aber wenn Sie herausfinden wollen, warum Sie unverständliche Fehler haben, wenn Sie in R arbeiten, oder wenn Sie einfach nur verstehen wollen, welche Parameter es in der Integrationsprozedur gibt oder welche Integrationsmethode sie dort programmiert haben, dann sehen Sie folgendes (Gott verzeihe mir, dass ich das für unreife Programmierkinder poste):
http://www.netlib.org/quadpack/
Dies ist nur der Titel der ursprünglich in Fortran geschriebenen Funktion. Der eigentliche Text wird später folgen. Dies ist das Originalprogramm, das im R-Paket für die Integration verwendet wird.
Was gibt es hier zu verstehen, sagen Sie es mir?