Optimisation des algorithmes. - page 6

 
C-4:

Tout le problème se situe dans le deuxième cycle. Il traite simultanément les branches gauche et droite de l'extremum potentiel et ne passe donc que par (N - 1)/2 barres, mais ce n'est pas suffisant. Des mesures montrent que le temps passé à chercher un extremum dans une progression arithmétique dépend de la période N, ce qui est très, très mauvais :

Il manque au moins une pause :

//Перебираем все бары
for (int bar = 0; bar < MyQuotes.Count; bar++)
{
   //Подготовка данных
   ...
   int pperiod = (N - 1)/2;
   //Перебираем бары относительно потенциального экстремума
   for (int i = 1; i <= pperiod; i++)
   {
      if (MyQuotes.High[bar - i] > MyQuotes.High[bar] ||
         MyQuotes.High[bar + i] > MyQuotes.High[bar])
         up = false;
      if (MyQuotes.Low[bar - i] < MyQuotes.Low[bar] ||
         MyQuotes.Low[bar + i] < MyQuotes.Low[bar])
         down = false;

      if ( !up && !down ) break; // А зачем искать дальше?
   }
}

Mieux encore, séparez vraiment le haut et le bas, et arrêtez-vous immédiatement après un contrôle infructueux.

 
Mathemat:

Si tout le reste échoue, essayez OCL.

Cela ne fera pas une grande différence.
 
TheXpert:
Cela ne fera pas une grande différence.
Oui, il le fera. Cela est dû au fait que la tâche ne nécessite pas une exécution séquentielle. L'historique complet des barres peut être divisé en k segments, chacun d'entre eux étant traité par un cœur de CPU différent. Je ne connais pas les mécanismes de l'OCL, mais je pense que le principe est le même ici. Un autre aspect du zig-zag lui-même est qu'il est séquentiel, chaque nouvelle ligne commençant à la fin de la précédente, ce qui rend le fractionnement en sous-tâches extrêmement difficile, voire impossible.
 
komposter:

Il manque au moins une pause :

Mieux encore, séparez vraiment le haut et le bas, et arrêtez-vous immédiatement après un contrôle infructueux.

Encore une fois, en séparant le haut et le bas, on obtient deux passages pour. Ce qui double le temps de recherche. La séparation en elle-même ne donne aucun gain de performance sans utiliser le multithreading, surtout pour les petits n.
 

Pourtant, l'OCL (ou le parallélisme au sens général) n'est pas une optimisation algorithmique, mais plutôt technique.

Je doute que dans votre cas il y ait un besoin de paralléliser la solution O(N)-variante la plus rapide au problème.

 
C-4:
Il le fera.

Pas de yada yada ? Montre-moi.

Alors, bonne chance. Discuter de l'optimisation d'un algorithme dont la complexité dépend linéairement de la valeur d'un paramètre est probablement quelque chose que vous n'avez pas à faire.

 
TheXpert:

Pas de yada yada ? Montre-moi.

Bref, bonne chance. Discutez de l'optimisation d'un algorithme dont la complexité dépend linéairement de la valeur d'un paramètre - vous n'avez vraiment rien à faire.

OK, je vais finir de compléter l'algorithme et poster les résultats de la mise en parallèle dans le studio.

hrenfx:

Pourtant, l'OCL (ou le parallélisme au sens général) n'est pas une optimisation algorithmique - il s'agit plutôt d'une optimisation technique.

Je doute qu'il y ait un besoin de paralléliser la solution O(N)-variante la plus rapide dans votre cas.

Comment dire. Toute parallélisation est toujours une complication sérieuse des algorithmes. De plus, si vous ne parallélisez pas un algorithme dont la dépendance à la quantité de données est linéaire, que pouvez-vous paralléliser d'autre ?

En bref, je vais réécrire l'algorithme et voir ce que cela apporte.

 
C-4:
Là encore, la séparation des hauts et des bas donne lieu à deux passages pour. Cela double le temps de recherche. La séparation en elle-même ne donne pas de gain de performance sans utiliser le multithreading, en particulier pour les petits n.

Comment pouvez-vous en être si sûr ?

Mon contrôle montre le contraire :

01:29:25 SpeedTest EURUSD,M15 entrées : Interations=10000 ; pperiod=10 ;

01:29:25 SpeedTest EURUSD,M15 : Nombre de barres = 3780

01:30:46 SpeedTest EURUSD,M15 : Fonction originale : 81.558 sec, extrema : 131 / 121

01:31:10 SpeedTest EURUSD,M15 : Avec mon édition (break) : 23.291 sec, extrema : 131 / 121

01:31:27 SpeedTest EURUSD,M15 : Avec ma pause (break) : 17.565 sec, extrema : 131 / 121

Vous trouverez ci-joint un script mq4.

Dossiers :
SpeedTest.mq4  4 kb
 

Un dernier test pour compléter le tableau :

01:38:56 SpeedTest EURUSD,M1 entrées : Interations=1000 ; pperiod=100 ;

01:38:56 SpeedTest EURUSD,M1 : Nombre de barres = 33896

01:50:19 SpeedTest EURUSD,M1 : Fonction originale : 683.565 sec, extrema : 121 / 127

01:50:54 SpeedTest EURUSD,M1 : Avec mon montage (break) : 34.383 sec, extrema : 121 / 127

01:51:16 SpeedTest EURUSD,M1 : Avec ma pause (break) : 22.714 sec, extrema : 121 / 127

 
komposter:
C.T.D. a écrit exactement ça dans son premier message.