Optimierung von Algorithmen. - Seite 7

 
komposter:

Wie können Sie so sicher sein?

Meine Überprüfung ergibt etwas anderes:

Das mq4-Skript befindet sich im Anhang.

Es scheint, dass die Aufteilung von Schleifen wirklich schneller funktioniert. Aber ich verstehe nicht, warum, denn es gibt zwei Durchgänge.
 
Es ist aber immer noch nicht die schnellste Option. Aber das ist nur ein "Blabla" von mir, denn ich werde keinen schnellen Bericht schreiben.
 
hrenfx:
Es ist aber immer noch nicht die schnellste Option. Aber es ist ein 'blah blah' meinerseits, denn ich werde keinen schnellen Bericht schreiben.
Das werde ich auch nicht. Obwohl ich zustimme, dass es schneller gehen kann.
 
hrenfx:
Es ist aber immer noch nicht die schnellste Option. Aber es ist ein "blah blah" meinerseits, denn ich werde nicht schnell schreiben.
MetaDriver:
Ich werde es auch nicht tun. Ich stimme allerdings zu - es könnte schneller gehen.

Dann lassen Sie es! Kaputt:(

Ich werde diesen Algorithmus selbst schreiben, ich weiß schon wie. Aber jetzt bin ich krank und muss es um eine Woche verschieben.

 
TheXpert:
C.T.D. schrieb genau das in seinem ersten Beitrag.
Ich beanspruche keine Vorrangstellung, sondern stimme dem Vorschlag irgendwie zu: "besser wirklich in 2 Zyklen aufteilen" )
 
C-4:
Das Cycle-Splitting scheint schneller zu funktionieren. Aber ich verstehe nicht, warum aus den Pässen zwei werden.
Denn in jedem Durchgang werden doppelt so viele Kontrollen durchgeführt, und die Durchgänge selbst werden oft kürzer (vorzeitig abgebrochen).
 
MetaDriver:
Und das werde ich auch nicht. Obwohl ich zustimme, dass es schneller gehen kann.

Das werde ich auch nicht, obwohl es durchaus möglich ist, schneller zu sein ;)

Ich habe gerade festgestellt, dass eine Pause fehlt, deshalb kann ich jetzt nicht weiter darauf eingehen.

 

Hier ist der endgültige Code. Es wird eine maximale Suchfunktion vorgestellt. Die Funktion zum Auffinden von Minima ist ähnlich:

private BitArray Up()
        {
            BitArray bits = new BitArray(MyQuotes.Count);
            double max = double.MinValue;
            int pperiod = (Period - 1) / 2;
            int bar = pperiod;
            int count = MyQuotes.Count - pperiod;
            //последняя позиция второго перебора.
            int pos = bar;
            bool rev = false;
            int rpos = bar;
            bool FirstEnter = false;
            while (bar < count - 1)
            {
                for (int i = 1; i <= pperiod; i++)
                {
                    max = MyQuotes.High[bar - i] > MyQuotes.High[bar + i]
                              ? MyQuotes.High[bar - i]
                              : MyQuotes.High[bar + i];
                    pos = bar + i;
                    if (max > MyQuotes.High[bar])
                    {
                        bar = pos;
                        break;
                    }
                    if (MyQuotes.High[bar + i] == MyQuotes.High[bar] && FirstEnter == false)
                    {
                        rev = true;
                        rpos = bar + i;
                        FirstEnter = true;
                    }
                    if (i == pperiod)
                    {
                        bits[bar] = true;
                        bar = rev ? rpos : pos;
                        rev = false;
                        FirstEnter = false;
                    }
                }
            }
            return bits;
        }

Hier sind die Leistungstests:

3       00:00:00.5070290
4       00:00:00.3920224
5       00:00:00.3960227
6       00:00:00.3620207
7       00:00:00.3570204
8       00:00:00.3230185
9       00:00:00.3350192
10      00:00:00.2820161
11      00:00:00.2910166
12      00:00:00.2730157
13      00:00:00.2990171
14      00:00:00.2450140
15      00:00:00.2770158
16      00:00:00.2890165
17      00:00:00.2480142
18      00:00:00.2400138
19      00:00:00.2530144
20      00:00:00.2410138
21      00:00:00.2660152
22      00:00:00.2310132
23      00:00:00.2350135
24      00:00:00.2290131
25      00:00:00.2300131
26      00:00:00.2390137
27      00:00:00.2290131
28      00:00:00.2350135
29      00:00:00.2290131
30      00:00:00.2530144
31      00:00:00.2200126
32      00:00:00.2680153
33      00:00:00.2250129
34      00:00:00.2260129
35      00:00:00.2360135
36      00:00:00.2240128
37      00:00:00.2240128
38      00:00:00.2260129
39      00:00:00.2160124
40      00:00:00.2390137
41      00:00:00.2190125
42      00:00:00.2270130
43      00:00:00.2210126
44      00:00:00.2090120
45      00:00:00.2360135
46      00:00:00.2210126
47      00:00:00.2550146
48      00:00:00.2170124
49      00:00:00.2220127
50      00:00:00.2180124
51      00:00:00.2090120
52      00:00:00.2180125
53      00:00:00.2380136
54      00:00:00.2170124
55      00:00:00.2270130
56      00:00:00.2070118
57      00:00:00.2200126
58      00:00:00.2230128
59      00:00:00.2080119
60      00:00:00.2400137
61      00:00:00.2160123
62      00:00:00.2100120
63      00:00:00.2240128
64      00:00:00.2220127
65      00:00:00.2170124
66      00:00:00.2100120
67      00:00:00.2100121
68      00:00:00.2260129
69      00:00:00.2160123
70      00:00:00.2240128
71      00:00:00.2110121
72      00:00:00.2190125
73      00:00:00.2140123
74      00:00:00.2110121
75      00:00:00.2260129
76      00:00:00.2090119
77      00:00:00.2230128
78      00:00:00.2080119
79      00:00:00.2070118
80      00:00:00.2510144
81      00:00:00.2180125
82      00:00:00.2080119
83      00:00:00.2070118
84      00:00:00.2060118
85      00:00:00.2060118
86      00:00:00.2070118
87      00:00:00.2100120
88      00:00:00.2060118
89      00:00:00.2080119
90      00:00:00.2710155
91      00:00:00.2180125
92      00:00:00.2110120
93      00:00:00.2080119
94      00:00:00.2060118
95      00:00:00.2060118
96      00:00:00.2020116
97      00:00:00.2080119
98      00:00:00.2100120
99      00:00:00.2090119

Es ist zu erkennen, dass die Verarbeitungsgeschwindigkeit qualitativ zugenommen hat und nun unabhängig von der Dauer des Extremums ist. Es stimmt, dass die Geschwindigkeit für kleine N, insbesondere für Periode 3, noch langsamer ist, aber mit zunehmendem N steigt die Geschwindigkeit schnell an und ist fast doppelt so schnell wie für kleine N:

Dies scheint darauf zurückzuführen zu sein, dass Bremssprünge und Indexierungsübergänge einige Zeit in Anspruch nehmen und über große Entfernungen wirksam sind. Bei kleinen N erweist sich das direkte Brute-Forcing als schneller.

P.S. Ich habe die Ausführung der beiden Funktionen Up() und Down() in den asynchronen Ausführungsmodus versetzt. Das heißt, sie können auf beiden Kernen gleichzeitig ausgeführt werden. Aber es hat die Leistung nicht erhöht. Offensichtlich sind die Durchläufe selbst nicht ressourcenintensiv, und die meiste Zeit wird für die Vorbereitung und das Parsen der Daten aufgewendet, nicht für die Iterationen selbst.

 
hrenfx:
Dennoch ist dies nicht die schnellste Option. Aber das ist "blah blah" von meiner Seite, denn ich werde nicht schnell einen Artikel schreiben.

Immer noch relevant.

P.S.

C-4:

Es ist zu erkennen, dass die Verarbeitungsgeschwindigkeit qualitativ zugenommen hat und nun unabhängig von der Extremwertperiode ist.

Es kommt darauf an, und das nicht zu knapp. In Ihrem Fall haben Sie gerade einen solchen Quellcode (CVR), der gerade bei Minimum N endet. Im allgemeinen Fall kann sich der Graph der Abhängigkeit der Ausführungsgeschwindigkeit von der Periode deutlich von dem Ihren unterscheiden.
 
hrenfx:

Immer noch relevant.

P.S.

Es kommt darauf an, und das nicht zu knapp. In Ihrem Fall handelt es sich nur um eine Quelle (TSS), die beim Minimum N endet. Im allgemeinen Fall kann sich die Grafik der Abhängigkeit der Ausführungsgeschwindigkeit von der Periode drastisch von der Ihren unterscheiden.

Eine kontroverse Aussage. Der Algorithmus arbeitet in einem Durchgang, und die Anzahl der Iterationen und damit die Geschwindigkeit sind nahezu unabhängig von N. Es stimmt, dass es eine Besonderheit des Algorithmus gibt, aufgrund derer BP Preisextreme einander gleich sind, was zu einem erheblichen Leistungsabfall führt. In allen anderen Fällen bin ich sicher, dass die Abhängigkeit erhalten bleiben sollte. In diesem Fall wurde ein klassischer normalverteilter Random Walk als BP angenommen.