Se passer des opérateurs logiques
Posté le 25/04/2014 16:57
Bonjour à tous, je me suis rendu compte que l'on pouvait se passer de And, Or, Not et Xor... en les remplaçant par des signes arithmétiques !
Cela se fait tout simplement grâce aux conditions booléennes. Pour ceux qui ne le savent pas, une condition est considérée comme étant un nombre, et vaut 1 si elle est vraie et 0 si elle est fausse.
Ainsi, si l'on considère deux conditions A et B :
A Or B
A And B
A Xor B
Not A
équivalent respectivement à :
A+B
A*B
A-B
1-A
Et quel serait l'intérêt d'utiliser cette méthode alors ? Et bien c'est plus rapide : j'ai fais quelques tests imprécis à l'arrache et les opérateurs arithmétiques sont environ 33% plus rapide. Je pense que je vais en faire d'autres pour préciser ces chiffres.
En revanche il y a des défauts. Outre le fait que ça nuit à la compréhension du code, cette méthode est en effet plus volumineuse en terme de taille, et ce à cause des parenthèse. Ces dernières sont indispensables, regardez l'exemple suivant par exemple :
(A=1) + (C>3)
En revanche, les conditions avec Not n'en requièrent pas, ce qui ne donne non pas une perte mais un gain de place :
Not A + Not B
Conclusion :
Remplacer des opérateurs logiques par des opérateurs arithmétiques ne sert à rien si vous voulez réduire la taille de votre programme. En revanche, ils peuvent vous permettre d'accélérer ce dernier en réduisant le temps d'exécution de certaines boucles (notamment les petites, puisque la condition y est vérifiée plus fréquemment). Pour finir, cette méthode peut constituer une astuce d'optimisation systématique avec les conditions qui n'utilisent pas de =,≠,<,>,≤ ou ≥, car elle confère un gain de place
et de temps.
Bref, l'idée est à creuser. Quoi qu'il en soit, n'oubliez pas que ça reste de la micro-optimisation
Citer : Posté le 25/04/2014 17:00 | #
Une optimisation remplacée par une autre (place par vitesse) Sinon joli tuto
Citer : Posté le 25/04/2014 17:04 | #
Tiens, je ne m'en servais pas car selon mes tests, c'était plus lent. Je vais les refaire, car ça m’intéresse si c'est effectivement plus rapide
Vitesse des fonctions en Basic Casio | 7 days CPC | Casio Universal Wiki | Tutoriel Basic Casio
>>> Give me a click Brother <<< >>> Teste mon générateur de mots nouveaux <<<
>>> Random Youtube Video <<<
Citer : Posté le 25/04/2014 18:27 | #
Mais, juste une remarque : prenons
-1->B
Alors A Or B = 1
Et A+ B = 0
Non ?
Coïncidence ? Je ne pense pas.
Citer : Posté le 25/04/2014 18:42 | #
Ce que tu as écrit n'est pas dans le code qu'il nous a fournit
Citer : Posté le 25/04/2014 18:48 | #
En fait ça ne marche que dans un sens, je m'explique :
Une condition vraie vaut 1
Une valeur autre que 0 (donc pas seulement 1) est une condition vraie
Or les opérateurs arithmétiques marchent bien uniquement lorsqu'on manipule des 1 et des 0, c'est-à-dire des conditions avec un signe (comme un =) ou un Not. Une simple variable utilisée comme condition peut être de n'importe quelle valeur.
Par ailleurs, j'ai refait des tests beaucoup plus précis : j'ai essayé des conditions dans une boucle de 10 000 itérations et je suis sur un temps de 0,0023 secondes...pour les deux :/ ! Du coup je vais voir ce que ça donne avec 100 000 itérations pour mieux voir s'il y a un écart.
Citer : Posté le 25/04/2014 18:50 | #
Ce que je veux dire avec mon exemple c'est que l'opérateur Or ne peut pas toujours être remplacé par un + car, par exemple avec deux nombres opposés, il donnera 0 même si les deux nombres sont différents de 0.
Coïncidence ? Je ne pense pas.
Citer : Posté le 25/04/2014 18:52 | #
Non, en effet
C'est vrai que je ferais mieux de le préciser, bien que cette astuce s'adresse à un public confirmé
Citer : Posté le 25/04/2014 19:29 | #
Moi je me sert de ça uniquement quand je veux faire des opérations.
Par exemple : X+(G=27)-(G=38→X
Toutes les formules de Première S.
Toutes les formules de Terminale S.
Un programme de calculs.
Super Mario 3
warrior
Jump Ball
First Fly
►Jeu gagnant des 48h CPC n°12◄
Mon site de discussion pour ados : http://entre-ados.net/ (a brûlé dans l'incendie d'OVH)
Mon éditeur de cours en ligne et plateforme de partage : http://wordline.xyz (a succombé à la concurrence de Google Drive...)
Citer : Posté le 25/04/2014 20:07 | #
Le titre portait à confusion, je suis d'avis qu'il ne faut surtout pas se passer des opérateurs logiques, notamment et surtout en C où un grand travail d'optimisation s'impose à chaque fois, et où ces opérateurs ont une grande importance, avec les algorithmes.
Citer : Posté le 25/04/2014 20:47 | #
Évidemment, mais là je parle uniquement du basic. Ce n'est pas en C qu'on aura besoin d'optimiser chaque condition
Citer : Posté le 25/04/2014 20:50 | #
Utiliser les opérateurs logiques reste une bonne habitude à prendre, du moins à mon avis, car ils permettent souvent d'éviter une déclinaison en liste de possibilités (donc de conditions), qui est autrement plus lourde en code.
Citer : Posté le 25/04/2014 20:56 | #
Mais comme l'indique le tuto, le volume de code n'est pas le seul critère. En basic, la vitesse est également un élément crucial.
Alors après, c'est sûr que c'est une mauvaise idée pour un débutant de se perdre dans des optimisations compliquées. C'est comme, par exemple, celle qui consiste à écrire Not A à la place de A=0 : c'est peu intuitif et on ne s'en occupe pas lorsqu'on découvre la programmation, mais à plus haut niveau on s'en sert pour optimiser légèrement.
Citer : Posté le 25/04/2014 21:04 | #
En effet, ça fait longtemps que je n'ai plus travaillé en Basic.
Et je suppose qu'à force je ne suis plus un débutant ?
Citer : Posté le 25/04/2014 22:49 | #
Dans le même style (je ne sais pas si c'est plus rapide mais ça permet d'éviter d'avoir à aller chercher dans les menus ) je crois que ≠ peut être remplacé par un - .
Coïncidence ? Je ne pense pas.
Citer : Posté le 26/04/2014 07:04 | #
En fait...
L'opérateur différent est exécuté en deux étapes: d'abord le processeur calcule la différence entre les deux nombres, et ensuite il constate si ce résultat est ou non nul.
L'opérateur moins n'implique que le calcul de la différence, mais pour savoir si la condition est validée, le processeur va chercher si elle est ou non nulle.
Du coup... il n'y a aucune différence, si la compilation est bien faite.
Au fait Positon, il y a un gros défaut à ta méthode, puisque les opérateurs logiques ne renvoient que des 0 et 1 alors que les opérateurs arithmétiques peuvent bien renvoyer 2 ou -1 en n'utilisant que des booléens, puisqu'ils ne les considèrent pas comme tels. Pour les conditions, c'est donc correct, mais pas dans les calculs.
Citer : Posté le 26/04/2014 07:06 | #
On commence à rentrer dans de l'optimisation binaire, mais le Basic est pas fait pour
Citer : Posté le 26/04/2014 08:09 | #
@Lephenixnoir : Ça n'a pas d'importance, puisque les instructions conditionnelles n'attendent pas un booléen mais simplement une valeur nulle pour une condition fausse et une valeur non nulle pour une condition vraie.
Ajouté le 26/04/2014 à 08:15 :
À moins que tu ne veuilles parler des calculs du type A+(B<3)->A ? Dans ce cas, oui, ça peut poser problème, mais c'est pas très grave.
Citer : Posté le 26/04/2014 08:20 | #
Oui, c'est bien ce que je disais.
Les calculs du genre
fonctionnent très bien en logique, mais plus en arithmétique.
Citer : Posté le 26/04/2014 09:20 | #
@lephenixnoir c'est comme ça en C mais il n'y a pas de compilation en basic (et on peut s'attendre a n'importe quoi avec la vitesse du basic Casio )
Coïncidence ? Je ne pense pas.
Citer : Posté le 26/04/2014 09:24 | #
Oui, d'autant plus que certaines fonctions sont codées sur 2 octets dans le fichier programme, donc elles sont plus longues à interpréter (enfin, disons surtout que les gérer oblige un ralentissement de la boucle principale).
Et puis, je crois que cet interpréteur nous réserve encore quelques suprises.
Personne n'en a refait un, plus complet (à part PRGM2, qui est différent) ?