Est-il possible d'éviter de nombreux "ou" (||) dans les conditions entraînant la même action ? - page 6

 
Meat:

borilunad, tout appel de fonction ajoute un freinage inutile. Par conséquent, si une vitesse maximale est requise, vous devez vous débarrasser de tous les if(), qui effectuent des opérations d'une syllabe. Il en va de même pour les boucles. La vérification des conditions dans une boucle est toujours beaucoup plus lente qu'une simple série de if() imbriqués.

Ainsi, même les conditions mutuellement exclusives sont meilleures avec l'action if(A || B || C || D) ;

Mais je ne peux pas éviter les appels de fonction, car je dois vérifier un grand nombre de données à ce moment-là, qui sont incluses dans ces conditions.

Je vais continuer mes expériences, peut-être que j'en tirerai quelque chose. Mais il n'y a aucun contrôle sur la propagation ! :)

 
En général, l'option la plus rapide serait celle-ci :
bool result;
if (A) result=true;
else
if (B) result=true;
else
if (C) result=true;
else
if (D) result=true;
else result=false;

if (result) Action();


Cependant, la ligneresult=false devrait être combinée avec la première,elle n'affectera pas la vitesse.En général, si A, B, C et D contiennent des conditions simples (avec un minimum d'arithmétique, sans appeler toutes les fonctions mathématiques et autres), alors vous n'obtiendrez pas un grand gain de performance d'une telle optimisation (à moins que cette construction ne s'exécute des dizaines de millions de fois, bien sûr).

J'ai écrit à ce sujet dans l'un des fils de discussion que tout doit être traité rationnellement. Pour une raison quelconque, il me semble que votre code est plein d'endroits plus importants dont l'optimisation donnerait vraiment un gain de performance énorme. Vous devriez commencer par l'algorithme de base. La plupart des débutants ont une vérification stupide de toutes les conditions concernant les TS ou les ordres ouverts à chaque tick. Mais dans la plupart des cas, il suffit de vérifier uniquement les conditions limites, par exemple lorsque la hausse ou la baisse atteint une certaine valeur, ou lorsqu'une nouvelle barre apparaît. Ce n'est qu'après cela que vous pouvez effectuer d'autres vérifications.

En dehors des calculs gourmands en ressources, vous devez envisager de transférer ces calculs dans une DLL. Sinon, rester assis et attendre pendant 13 minutes dans ce putain de MQL4 (alors que vous pouvez obtenir le même résultat en 2-3 minutes) semble être malheureux :)

 
Meat:
En général, l'option la plus rapide serait celle-ci :

Cependant, la ligneresult=false devrait être combinée avec la première,elle n'affectera pas la vitesse.En général, si A, B, C et D contiennent des conditions simples (avec un minimum d'arithmétique, sans appeler toutes les fonctions mathématiques et autres), alors vous n'obtiendrez pas un grand gain de performance d'une telle optimisation (à moins que cette construction ne s'exécute des dizaines de millions de fois, bien sûr).

J'ai écrit à ce sujet dans l'un des fils de discussion que tout doit être traité rationnellement. Pour une raison quelconque, il me semble que votre code est plein d'endroits plus importants dont l'optimisation donnerait vraiment un gain de performance énorme. Vous devriez commencer par l'algorithme de base. La plupart des débutants ont une vérification stupide de toutes les conditions concernant les TS ou les ordres ouverts à chaque tick. Mais dans la plupart des cas, il suffit de vérifier uniquement les conditions limites, par exemple lorsque la hausse ou la baisse atteint une certaine valeur, ou lorsqu'une nouvelle barre apparaît. Ce n'est qu'après cela que vous pouvez effectuer d'autres vérifications.

En dehors des calculs gourmands en ressources, vous devez envisager de transférer ces calculs dans une DLL. Sinon, rester assis et attendre pendant 13 minutes dans ce putain de MQL4 (alors que vous pouvez obtenir le même résultat en 2-3 minutes) semble être malheureux :)

L'option la plus rapide a été suggérée par Paco
 
tara:
L'option la plus rapide a été suggérée par Paco

Pensez-vous vraiment qu'il est plus rapide de faire la somme de plusieurs valeurs à chaque fois (c'est-à-dire d'effectuer des opérations arithmétiques supplémentaires) ? Dans ma variante, la vérification est terminée dès la première correspondance, alors que dans la variante que vous avez mentionnée - seulement après avoir fait la somme de toutes les valeurs et ensuite vérifié la somme.

De plus, cette variante nécessite de calculer TOUTES les conditions à l'avance. De quel genre de vitesse parle-t-on ici ? C'est l'option la plus lente.

 
et échanger - cas n'est pas une bonne idée ?
 

Si vous voulez accélérer, vous pouvez essayer les opérations par bit.

C'est-à-dire que toutes les variables doivent être de type int (false=0). Ensuite, au sens des bits, A|B|C...>0

 
Avals:

Si vous voulez accélérer, vous pouvez essayer les opérations par bit.

C'est-à-dire que toutes les variables doivent être de type int (false=0). Ensuite, au sens des bits, A|B|C...>0

Et quel est l'intérêt de tout cela ? Comme pour la sommation, toutes les conditions doivent être précalculées. Et pourquoi les calculer toutes, si une seule des conditions suffit.
 

Et personne ne vérifiera la rapidité d'exécution des variantes proposées ?

Vous pouvez utiliser le script à partir d'ici

 
Meat:
En général, l'option la plus rapide serait celle-ci :

Cependant, la ligneresult=false devrait être combinée avec la première,elle n'affectera pas la vitesse.En général, si A, B, C et D contiennent des conditions simples (avec un minimum d'arithmétique, sans appeler toutes les fonctions mathématiques et autres), alors vous n'obtiendrez pas un grand gain de performance d'une telle optimisation (à moins que cette construction ne s'exécute des dizaines de millions de fois, bien sûr).

J'ai écrit à ce sujet dans l'un des fils de discussion que tout doit être traité rationnellement. Pour une raison quelconque, il me semble que votre code est plein d'endroits plus importants dont l'optimisation donnerait vraiment un gain de performance énorme. Vous devriez commencer par l'algorithme de base. La plupart des débutants ont une vérification stupide de toutes les conditions concernant les TS ou les ordres ouverts à chaque tick. Mais dans la plupart des cas, il suffit de vérifier uniquement les conditions limites, par exemple lorsque la hausse ou la baisse atteint une certaine valeur, ou lorsqu'une nouvelle barre apparaît. Ce n'est qu'après cela que vous pouvez effectuer d'autres vérifications.

En dehors des calculs gourmands en ressources, vous devez envisager de transférer ces calculs dans une DLL. Sinon, il serait malheureux de rester assis et d'attendre pendant 13 minutes dans ce putain de MQL4 (même si nous pouvons obtenir le même résultat en 2 ou 3 minutes).

if (A) Action();
 else
  if (B) Action();
   else
    if (C) Action();
     else
      if (D) Action();

C'est encore plus rapide comme ça.

Je me souviens d'une histoire :

"Lors d'une réunion du conseil d'administration d'une entreprise, il y avait deux questions :

1. La décision de construire un synchrophasotron.

2. La décision de construire un parking à vélos pour les employés.

Sur la première question, la discussion a duré 1 minute,

le 2, le débat a duré plus de 2 heures".

 
Ceux qui n'aiment pas "putain de MQL4" pourraient aussi bien aller courir, courir. Car on ne sait pas très bien ce qu'il fait ici. malgré tous les mérites et l'ancienneté du compte.