Caractéristiques du langage mql5, subtilités et techniques - page 117
Vous manquez des opportunités de trading :
- Applications de trading gratuites
- Plus de 8 000 signaux à copier
- Actualités économiques pour explorer les marchés financiers
Inscription
Se connecter
Vous acceptez la politique du site Web et les conditions d'utilisation
Si vous n'avez pas de compte, veuillez vous inscrire
Voici la variante que j'ai trouvée :
Elle est censée être la plus rapide de toutes les variantes possibles. Tous les calculs sont effectués avec des constantes, donc ils sont calculés pendant la compilation. Ainsi, tout est réduit à seulement 6 comparaisons consécutives et rien de plus. Cependant, cette variante fonctionne plus lentement que la précédente. Je ne peux pas comprendre la raison de cela.
Voici la variante que j'ai trouvée :
Dans l'idée, c'est la plus rapide de toutes. Tous les calculs sont faits avec des constantes, donc ils sont calculés pendant la compilation. Ainsi, tout est réduit à seulement 6 comparaisons consécutives, et rien de plus. Cependant, cette variante fonctionne plus lentement que la précédente. Je n'arrive pas à comprendre la raison.
Diviser par deux le ralentit ? Essayer de remplacer par un décalage ? Je soupçonne que les constantes calculées - doivent être calculées immédiatement (dans ce cas - et le décalage dans la définition - doit également être remplacé par une constante).
En outre, "question" est un opérateur plutôt controversé, comme je le sais. Il y a vingt ans, il a été vérifié en C++ et parfois "question" génère un code beaucoup plus long que l'opérateur if habituel. Peut-être que c'est la même chose ici ?
Et, je ferais en sorte que le code de retour soit uint - et s'il y a des contrôles lors de la conversion des valeurs signées et non signées ?
Je n'ai pas encore eu l'occasion d'expérimenter manuellement - le processeur est surchargé... Même le texte est tapé "avec lenteur"...
Diviser par deux le ralentit ? Essayez de le remplacer par un décalage ? Je soupçonne que les constantes calculées - doivent être calculées immédiatement (dans ce cas - et le décalage dans la définition - doit également être remplacé par une constante).
Par ailleurs, le terme "question", comme je le sais, est un opérateur assez controversé...
Remplacer la division par shift n'a aucun effet. Je soupçonne que l'expression résultante est trop longue, et que le compilateur ne l'a pas optimisée jusqu'au bout.
Mais j'ai effectué les tests avec Optimize=0, alors que lorsque l'optimisation était activée, tout s'est bien passé - la deuxième variante était une fois et demie plus rapide. Bingo !
Si l'optimisation est désactivée, la deuxième option est légèrement plus lente pour les petites valeurs, mais légèrement plus rapide pour les grandes. En bref, la deuxième option est nettement meilleure.
Voici la variante que j'ai trouvée :
Cette variante est censée être la plus rapide de toutes les variantes possibles. Tous les calculs sont effectués avec des constantes, c'est-à-dire qu'ils sont calculés pendant la compilation. Ainsi, tout est réduit à seulement 6 comparaisons consécutives et rien de plus. Cependant, cette variante fonctionne plus lentement que la précédente. Je ne peux pas en comprendre la raison.
C'est exact - votre variante est la plus rapide.
C'est juste que le test est au ralenti. Les programmeurs oublient très souvent une chose importante lorsqu'ils testent les performances : si une valeur calculée n'est utilisée nulle part, le compilateur n'effectuera tout simplement pas le calcul.
C'est logique, quel est l'intérêt ? C'est comme dans une superposition quantique. Pourquoi la lune devrait-elle exister si personne ne la regarde. "La lune existe-t-elle juste parce qu'une souris la regarde ?" (Albert Einstein). :))
Cette version du test avec le calcul de la somme de contrôle et son impression serait donc plus correcte :
Résultat :
Et la deuxième place est toujours _FastLog2, pas log2 :))C'est juste un test au ralenti. Un point important est souvent oublié dans les tests de performance : si la valeur calculée n'est utilisée nulle part, le compilateur n'effectue tout simplement pas le calcul.
C'est logique, quel est l'intérêt ? C'est comme dans une superposition quantique. Pourquoi la lune devrait-elle exister si personne ne la regarde. "La lune existe-t-elle juste parce qu'une souris la regarde ?" (Albert Einstein). :))
Cette version du test avec le calcul de la somme de contrôle et son impression serait donc plus correcte :
Votre code est enchevêtré. Les variables utilisées dans la définition sont situées à l'autre bout du code du programme - il n'est pas pratique de faire le tri dans un tel chaos. Mais là n'est pas la question. La question est que les résultats de vos tests ne peuvent pas être considérés comme fiables parce que le compilateur connaît à l'avance l'algorithme des valeurs passées dans la fonction. Il optimise donc vos tests. Vous devriez calculer sur des nombres aléatoires .
Au fait, pourquoi avez-vous srand dans votre code ? Quand je l'ai vu, j'ai d'abord pensé que vous utilisiez random, mais en fait ce n'est pas le cas.
Voici mon code :
Votre code est confus. Les variables utilisées dans la définition sont situées à l'autre bout du code du programme - il n'est pas pratique de faire le tri dans un tel chaos. Mais ce n'est pas le point, le point est que les résultats de vos tests ne peuvent pas être considérés comme fiables, parce que le compilateur connaît à l'avance l'algorithme des valeurs passées dans la fonction. Par conséquent, il optimise vos tests. Vous devriez calculer sur des nombres aléatoires .
Au fait, pourquoi avez-vous srand dans votre code ? Quand je l'ai vu, j'ai d'abord pensé que vous utilisiez random, mais ce n'est pas le cas.
Voici mon code :
le code n'est pas le mien. Je viens de le modifier et de supprimer rand pour vérifier les mêmes sommes de contrôle et supprimer la fonction rand relativement coûteuse de la boucle, mais j'ai simplement oublié de supprimer srand.
Je renvoie le rand. Vous avez raison - le compilateur optimise la boucle pour la somme des logarithmes de valeurs consécutives. Je suis surpris, cependant. Je ne comprends pas comment il fait ça. Il y a peut-être quelque chose que nous ne prenons pas en compte.
Résultat :
Le gagnant actuel est _FastLog2
Résultat :
Gagnant actuel _FastLog2
Je me demande comment vous avez obtenu la même somme de contrôle partout, si les valeurs sont aléatoires.
Je me demande comment on peut obtenir la même somme de contrôle partout, si les valeurs sont aléatoires.
srand(45) pour toutes les fonctions
J'ai fait comme ça au début, mais j'ai obtenu des sommes de contrôle différentes, car je n'ai pas pris en compte le fait que rand()*rand() peut être égal à 0, ce qui casse la somme de contrôle. Maintenant, j'en ai ajouté un pour m'éloigner du zéro.
srand(45) pour toutes les fonctions
J'ai fait la même chose au début, mais j'ai obtenu des sommes de contrôle différentes, car je n'ai pas tenu compte du fait que rand()*rand() peut être 0, ce qui casse la somme de contrôle. Maintenant, j'en ai ajouté un pour m'éloigner du zéro.
Et pourquoi avez-vous besoin de la même somme de contrôle si nous parlons spécifiquement de mesures de vitesse ? L'intérêt de la somme dans ce cas est simplement d'empêcher le compilateur de couper le code, c'est tout. Et en faisant srand(45), vous permettez à nouveau d'optimiser le test.
D'ailleurs, en parlant de zéro, FastLog2 ne vérifie pas le zéro, ce qui lui donne une longueur d'avance. Mais il est toujours une fois et demie à deux fois plus lent que log2 s'il est testé correctement).
Et pourquoi avez-vous besoin de la même somme de contrôle si nous parlons spécifiquement de mesures de vitesse ? L'intérêt de la somme dans ce cas est simplement d'empêcher le compilateur de couper le code, c'est tout. Et faire srand(45), encore une fois, vous permet d'optimiser le test.
Vous surestimez les capacités du compilateur ici. Supprimez srand(45) - les sommes de contrôle seront différentes, mais le résultat en termes de vitesse reste le même.
De plus, j'ai été guidé par le fait que les calculs étaient les mêmes pour la pureté de l'expérience, car je ne suis pas entré dans le détail de toutes les fonctions. Parfois, la valeur d'un paramètre de fonction peut affecter le temps de son exécution.
Raison de plus pour vérifier l'exactitude des algorithmes.