Aidez-moi à apprendre à programmer. - page 3

 
Tio Nisla:
Je voulais ajouter plus tôt que si la fonction somebodyfunc() effectue d'autres manipulations en plus de retourner un certain montant ou quelque chose, calcule des paramètres commerciaux, par exemple, une telle utilisation provoque des artefacts difficiles à attraper et peut conduire l'auteur du code à la stupeur : "Ht ? Pourquoi 4 fois ? O_o F$#@ !!!! Il n'est pas censé être là trois fois ? Pourquoi mon EA me ment-il ?". C'est ce que j'ai appelé le "shithcod", dont un expert s'est indigné jusqu'à la racine des cheveux. Je n'en ai pas parlé, car c'est évident, mais vous l'avez fait pour moi. Mais vous n'avez pas pris en compte le fait que l'adressage par un index calculé dynamiquement sans réinitialisation du tableau est autre chose. Dans les sys nus, cela conduit généralement à GPF, dans les plus avec des pointeurs intelligents et des tableaux à une exception et son gestionnaire. Dans mql, il n'est pas évident de savoir à quoi cela mène.

Qu'est-ce qu'un "artefact insaisissable" ? C'est un truc religieux ? Vous l'inventez, vous le croyez ?

 
Aleksandr Slavskii:

Messieurs, des personnalités, mais découvrons la vérité.

Je vois dans l'exemple quePositionsTotal()est appelé à chaque itération de la boucle.

Mais Dimitri, au contraire, tu dis que le compilateur le fait d'une manière différente - je ne comprends pas. Expliquer.

Si vous voulez dire que la fonctionPositionsTotal() ne recalcule pas les positions à chaque fois, mais renvoie simplement la valeur d'une variable contenant le nombre de positions ouvertes, alors oui, vous avez raison, il n'y a aucun sens à déclarer une variable de plus, mais alors qu'est-ce que le compilateur a à faire avec cela ?

Et si cette fonction recalcule les positions ouvertes à chaque fois, il s'avère que le compilateur doit comprendre si la valeur de cette fonction affecte les calculs ultérieurs et utilise soit une fonction, soit une variable.

Je n'arrive pas à le faire correctement.

Il recalcule à chaque fois ou ne recalcule pas, mais l'appel de PositionTotal() est définitivement coûteux. Et cela est facilement prouvé par une simple expérience. Mais au lieu de donner une expérience qui me mettrait en pièces, ils trouvent des arguments fantaisistes avec des "artefacts difficiles à trouver". Vous pouvez trouver cet exemple de code à partir de la première page que vous connaissez et voir comment cela se présente là))). Il a été délibérément modifié avant d'être inséré dans le forum (grands applaudissements). Et cela n'a été fait que pour éviter d'imposer des charges inutiles à un débutant.

Et le compilateur, je voulais dire qu'il optimise le code et appelle la variable directement au lieu de passer par une fonction :

int x;

for(;i<x;)

и

for(;i<F();)

int F(){return(x);}

On le voit clairement avec la fonction ArraySize() ; on ne peut pas faire la différence entre l'appel d'une fonction et l'utilisation d'une variable avec celle-ci. Mais avec PositionsTotsl() ce n'est pas le cas, hélas.

Au passage, vous pouvez également vous pencher sur la déclaration des variables à l'intérieur d'une boucle, qui réduit également la vitesse. Qu'est-ce qui ne va pas jusqu'à la racine ? Vous n'êtes pas au courant ? Bien que nous puissions discuter ici aussi, il y a une différence entre 4 et 5.

 

PositionsTotal() ne demande-t-il pas à chaque fois le nombre de positions ouvertes? Ou peut-être est-il optimisé et enregistre-t-il la valeur dans une constante avec une marque de mise à jour et renvoie-t-il toujours le même nombre s'il ne change pas) ?

Il doit y avoir une optimisation interne de cette fonction. Les développeurs ne sont pas idiots de faire une fonction aussi importante et potentiellement coûteuse pour "ça fera de toute façon".

Que ceux qui s'indignent vérifient combien de temps et de ressources il faut pour effectuer les deux variantes d'une même boucle.

Il n'y a pas besoin de jeter du caca.


J'aimerais voir le code source de PositionsTotal() par pur intérêt académique.


Eh bien, quand on y pense, le plus simple serait de créer une variable globale du terminal stockant cette valeur. Et ne retourner que cette valeur. Et de la mettre à jour à l'ouverture ou à la fermeture des positions - pour sécuriser la variable et la synchroniser, de sorte que Dieu ne veuille pas que quelque chose y soit écrit.

Je pense que c'est ainsi que cela se passe.

Peut-être que les données relatives aux positions elles-mêmes sont stockées dans certaines structures de données, de sorte qu'il est possible de les obtenir sans se tourner inutilement vers les serveurs. En général, je pense que tout est normal avec la productivité dans toute variante de l'appel d'offres.


Et le style du code est esthétiquement beau ou non, chacun décide pour lui-même)

 
Nikolay Mitrofanov:

Que ceux qui s'indignent vérifient combien de temps et de ressources il faut pour faire fonctionner les deux variantes d'un même cycle.

Il n'y a pas besoin de jeter du caca.

J'espère qu'il ne s'adressait pas à moi, car je ne doute pas de l'autorité de Dmitriy.Tio Nislaaussi semble coder depuis longtemps, mais


J'apprends, c'est pourquoi je demande.

 

La fonction PositionsTotal() est délicate, elle doit toujours renvoyer le bon chiffre, et changer sa valeur dès que le nombre de positions change. Il est donc peu probable qu'il soit un jour aussi rapide qu'une simple variable ou qu'ArraySize().

 
Aleksandr Slavskii:

...


J'apprends, c'est pourquoi je demande.

Si vous êtes en apprentissage, ne vous laissez pas du tout abattre par ces petites choses. Concentrez-vous sur la capacité à traduire votre idée en code (ou un processus mal défini en une séquence d'actions). Et ensuite, le code peut être modifié comme vous le souhaitez.

 
Dmitry Fedoseev:

Si vous êtes en apprentissage, ne vous souciez pas du tout de ces détails. Concentrez-vous sur la capacité à traduire votre idée en code (ou un processus mal défini en une séquence d'actions). Et ensuite, le code peut être modifié comme vous le souhaitez.

Je pense que c'est bien qu'une personne essaie de comprendre et de creuser plus profondément.

En ne faisant pas attention aux petites choses, le codeur prend l'habitude d'écrire le code comme il l'entend. Et puis peigner le code signifie un double travail et souvent non seulement pour l'auteur mais aussi pour ceux qui ont encore la chance de travailler avec le code.

Pourquoi s'embêter à écrire du code quand on peut le faire correctement, l'écrire bien et en comprendre les détails) ?

Votre conseil est... eh bien... IMHO


Votre conseil est bon pour un programmeur expérimenté (fortement sûr de lui) qui peut alors faire le ménage, car il sait où et ce qui doit être nettoyé.

 
Nikolay Mitrofanov:

Pour moi, je pense que c'est bien qu'une personne essaie de comprendre et creuse plus profondément...

En ne prêtant pas attention aux petites choses, le codeur prend alors l'habitude d'écrire le code de la mauvaise manière. Et puis peigner le code signifie un double travail et souvent non seulement pour l'auteur mais aussi pour ceux qui ont encore la chance de travailler avec le code.

Pourquoi s'embêter à écrire du code quand on peut le faire correctement, l'écrire bien et en comprendre les détails) ?

Votre conseil est... eh bien... IMHO


Votre conseil est bon pour un programmeur expérimenté (fortement sûr de lui) qui peut alors passer au peigne fin, car il sait où et ce qui doit être passé au peigne fin.

Pour les débutants d'autant plus - il vaut mieux, au moins d'une manière ou d'une autre, résoudre un problème, au lieu de rester coincé à un niveau de chamaillerie de forum comme "comment on peut écrire ici sans const, et ici sans static, etc., etc. ou - oh mec, si tu poses cette question, alors tu ferais mieux de ne pas t'approcher de la programmation du tout".

Il ne se passe pas une semaine sans que quelqu'un ne m'envoie un indicateur pour corriger un code comme celui-ci : for(int i=0;i<Bars;i++). Et vous frottez les problèmes ici, ce qui peut vous donner de la vitesse... Eh bien, 30%.

Même les EAs efficaces (dans le sens de la rapidité des tests) sont des problèmes de leur algorithme, qui renaît à chaque fois pour chaque stratégie spécifique, plutôt qu'un problème de subtilités syntaxiques.

 
Dmitry Fedoseev:

Pour les débutants d'autant plus - il est préférable de résoudre le problème au moins d'une manière ou d'une autre, plutôt que de rester bloqué à un niveau de chamaillerie de forum comme "comment vous pouvez écrire ici sans const, et ici sans static, etc., etc. ou - oh mec, si vous posez cette question, alors vous feriez mieux de ne pas aborder la programmation du tout".

Il ne se passe pas une semaine sans que quelqu'un ne m'envoie un indicateur pour corriger un code comme celui-ci : for(int i=0;i<Bars;i++). Et vous frottez des problèmes ici, ce qui peut donner de la vitesse... Eh bien, 30%.

Si un programmeur novice demande quelque chose sur le forum, cela signifie qu'il veut connaître la réponse, qu'il est intéressé et qu'il en a besoin. J'ai même créé un fil de discussion pour obtenir des conseils.

Si j'ai bien saisi le sens du sujet, la question de la mise en œuvre de son idée n'était pas "faites-le bien mais faites-le fonctionner" mais le mieux et le plus correctement possible. C'est bien. C'est vrai.

"D'une manière ou d'une autre" pour toute activité est une approche terrible.

D'abord le comprendre, puis le faire en connaissance de cause - la meilleure approche.

 
Nikolay Mitrofanov:

Si un programmeur novice demande quelque chose sur le forum, cela signifie qu'il veut connaître la réponse, qu'il est intéressé et qu'il en a besoin. Il a même créé ce fil de discussion pour obtenir des conseils.

Si j'ai bien compris l'auteur du fil de discussion, la question de la mise en œuvre de son idée n'est plus "faites comme vous voulez pour que ça marche", mais tout de suite le mieux possible et le plus juste possible. C'est bien. C'est vrai.

"D'une manière ou d'une autre" pour toute activité est une approche terrible.

Comprendre d'abord, faire ensuite avec la connaissance, c'est le mieux.

En sachant quoi ? Si cet algorithme n'existe pas dans la nature, il doit être inventé tout seul, et c'est l'algorithme qui définit tout.

Raison: