Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

trigraphe dans test conditionnel !

19 réponses
Avatar
jmm
Je viens de parcourir un morceau de code qui contient ce genre
d'instruction :

if( dots == 0 ? len > 8 : len > 3 ) ...

Supprenant non ?
Quand pensez-vous ( performance, maintenabilité, ...) ?

9 réponses

1 2
Avatar
Alexandre Bacquart
On 06/21/2010 11:21 AM, Antoine Leca wrote:
Pierre Maurette a écrit :
if(len> 3 + 5*(dots == 0)) ...

Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement.



Mouais. Pas sûr. Soit ton compilo est pipô, et il va te coller quand
même le branchement caché dans l'opérateur == utilisé dans un contexte
entier, parce qu'en fait il faut lire cet opérateur comme
(dots==0 ? 1 : 0)

Soit il est performant, et il va « supprimer » aussi bien le branchement
inhérent à l'opérateur ?: que celui de l'opérateur == utilisé comme entier.


Et si tu me dis qu'il est compliqué d'optimiser en général l'opérateur
?: pour éviter les sauts, je suis d'accord avec toi, il y a plus de
chances que le compilateur passe du temps à simplifier le if()...
et au passage, il va probablement représenter l'expression complète de
la même manière que l'on utilise ?: ou 5*(==0), donc au final il n'y a
aucune différence, et il vaut mieux prendre l'écriture la plus lisible
(et oui, je suis conscient qu'ici, c'est Charybde et Scylla.)



C'est exactement le schéma de pensée que j'ai depuis quelques années, en
tous cas, dès qu'il s'agit d'expressions relativement simples comme
celle-ci. J'avoue ne plus trop me focaliser sur les expressions et la
manière dont le compilo va les traduire, plutôt sur les algorithmes dans
leur ensemble. C'est une bonne chose finalement qu'on ait plus trop à
s'occuper de ce genre de choses (le seul hic, c'est la petite
frustration de ne plus pouvoir prouver sa supériorité par rapport à la
machine avec une profusion d'expressions tordues, mais il y a encore de
la marge).

--
Alex
Avatar
espie
In article ,
Pierre Maurette wrote:
Antoine Leca, le 18/06/2010 a écrit :
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...



Je lis assez bien:

if(len > 3 + 5*(dots == 0)) ...

J'utilise assez couramment ce genre de truc en interprêté et quand je
me fiche de la performance. C'est à dire 99,99...% des cas.
Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement. Faudrait s'occuper du /if/, mais ce
n'est pas ici le problème.
Le compilateur ne va pas générer une multiplication, très coûteuse.
Mais certainement une multiplication par une constante, c'est à dire
une paire d'instructions peu coûteuses. Comme on dit à la pétanque, je
pense que selon le contexte, ça se mesure...



Je te trouve bien categorique dans tes hypotheses de generation de code...
Un peu de sens commun ne ferait pas de mal.

Perso:
- j'ecris le code le plus clair que je peux. Deja comme ca, je vois mieux,
et je peux faire de la macro-optimisation.
- une fois que ca marche, je teste. Si ca rame, je regarde qu'est-ce que
j'ai rate cote algorithmiques et optimisations triviales ("low-hanging fruit",
ou comment gagner 90% de performances avec 10% d'effort).
- si vraiment il y a un "hot spot" qui bouffe toutes les perfs, je ne vais
pas m'amuser a supputer. Je sais expliquer a mon compilo de me montrer
l'assembleur qu'il pond, et je sais aussi comment lui faire faire des
optimisations en plus.
Avatar
JKB
Le 21-06-2010, ? propos de
Re: trigraphe dans test conditionnel !,
Marc Espie ?crivait dans fr.comp.lang.c :
In article ,
Pierre Maurette wrote:
Antoine Leca, le 18/06/2010 a écrit :
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...



Je lis assez bien:

if(len > 3 + 5*(dots == 0)) ...





Ce ne serait pas un peu casse gueule ? Est-on sûrs sur (dots == 0)
renvoie toujours 0 ou 1 et non une valeur non nulle ?

J'ai un vieux compilo qui utilise -1 comme valeur 'vraie' et teste
par rapport à 0 pour savoir si un entier correspond à 'vrai' ou
'faux' (c'est un compilo pré-ansi et je ne me suis jamais penché
depuis sur ce problème, je ne sais pas si ça été mis dans les specs
et mon expérience me dit de se méfier de tels trucs).

J'utilise assez couramment ce genre de truc en interprêté et quand je
me fiche de la performance. C'est à dire 99,99...% des cas.
Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement. Faudrait s'occuper du /if/, mais ce
n'est pas ici le problème.
Le compilateur ne va pas générer une multiplication, très coûteuse.
Mais certainement une multiplication par une constante, c'est à dire
une paire d'instructions peu coûteuses. Comme on dit à la pétanque, je
pense que selon le contexte, ça se mesure...



Je te trouve bien categorique dans tes hypotheses de generation de code...
Un peu de sens commun ne ferait pas de mal.

Perso:
- j'ecris le code le plus clair que je peux. Deja comme ca, je vois mieux,
et je peux faire de la macro-optimisation.
- une fois que ca marche, je teste. Si ca rame, je regarde qu'est-ce que
j'ai rate cote algorithmiques et optimisations triviales ("low-hanging fruit",
ou comment gagner 90% de performances avec 10% d'effort).
- si vraiment il y a un "hot spot" qui bouffe toutes les perfs, je ne vais
pas m'amuser a supputer. Je sais expliquer a mon compilo de me montrer
l'assembleur qu'il pond, et je sais aussi comment lui faire faire des
optimisations en plus.



JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Pierre Maurette
JKB, le 21/06/2010 a écrit :
Le 21-06-2010, ? propos de
Re: trigraphe dans test conditionnel !,
Marc Espie ?crivait dans fr.comp.lang.c :
In article ,
Pierre Maurette wrote:
Antoine Leca, le 18/06/2010 a écrit :
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...



Je lis assez bien:

if(len > 3 + 5*(dots == 0)) ...





Ce ne serait pas un peu casse gueule ? Est-on sûrs sur (dots == 0)
renvoie toujours 0 ou 1 et non une valeur non nulle ?



Oui, dots == 0, ou !dots, renvoient 0 ou 1. C'est dans la norme. Même
si dots peut avoir d'autres valeurs.


J'ai un vieux compilo qui utilise -1 comme valeur 'vraie' et teste
par rapport à 0 pour savoir si un entier correspond à 'vrai' ou
'faux' (c'est un compilo pré-ansi et je ne me suis jamais penché
depuis sur ce problème, je ne sais pas si ça été mis dans les specs
et mon expérience me dit de se méfier de tels trucs).



Un programmeur peut décider de renvoyer -1 comme valeur vraie. Mais un
opérateur logique ne renvoie que 0 ou 1.

--
Pierre Maurette
Avatar
JKB
Le 21-06-2010, ? propos de
Re: trigraphe dans test conditionnel !,
Pierre Maurette ?crivait dans fr.comp.lang.c :
JKB, le 21/06/2010 a écrit :
Le 21-06-2010, ? propos de
Re: trigraphe dans test conditionnel !,
Marc Espie ?crivait dans fr.comp.lang.c :
In article ,
Pierre Maurette wrote:
Antoine Leca, le 18/06/2010 a écrit :
if( dots == 0 ? len > 8 : len > 3 ) ...

Quand pensez-vous ( performance, maintenabilité, ...) ?



Que c'est plus lisible que
if( len > (dots==0)*5+3 ) ...



Je lis assez bien:

if(len > 3 + 5*(dots == 0)) ...





Ce ne serait pas un peu casse gueule ? Est-on sûrs sur (dots == 0)
renvoie toujours 0 ou 1 et non une valeur non nulle ?



Oui, dots == 0, ou !dots, renvoient 0 ou 1. C'est dans la norme. Même
si dots peut avoir d'autres valeurs.



Bon, je me coucherais moins bête ce soir.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
=> http://grincheux.de-charybde-en-scylla.fr
Avatar
Pierre Maurette
Antoine Leca, le 21/06/2010 a écrit :
Pierre Maurette a écrit :
if(len > 3 + 5*(dots == 0)) ...

Maintenant imaginons que ce test soit dans un boucle stratégique.
Avantage, on évite un branchement.



Mouais. Pas sûr. Soit ton compilo est pipô, et il va te coller quand
même le branchement caché dans l'opérateur == utilisé dans un contexte
entier, parce qu'en fait il faut lire cet opérateur comme
(dots==0 ? 1 : 0)

Soit il est performant, et il va « supprimer » aussi bien le branchement
inhérent à l'opérateur ?: que celui de l'opérateur == utilisé comme entier.


Et si tu me dis qu'il est compliqué d'optimiser en général l'opérateur
?: pour éviter les sauts, je suis d'accord avec toi, il y a plus de
chances que le compilateur passe du temps à simplifier le if()...
et au passage, il va probablement représenter l'expression complète de
la même manière que l'on utilise ?: ou 5*(==0), donc au final il n'y a
aucune différence, et il vaut mieux prendre l'écriture la plus lisible
(et oui, je suis conscient qu'ici, c'est Charybde et Scylla.)



Certes. Ma remarque était fausse. Elle aurait du sens si dots ne
pouvait valoir que 0 ou 1. Avec un tel nom, je suppute que ce n'est pas
le cas.
if(len > 3 + 5*!dots) ...
n'est pas meilleur pour ce qui nous intéresse. Sous réserve de
vérification dans le jeu d'instruction, ! est comme l'opérateur ==, il
se lit et se calcule par:
(dots==0 ? 1 : 0)

--
Pierre Maurette
Avatar
Pierre Maurette
Pierre Maurette, le 21/06/2010 a écrit :

[...]

Oui, dots == 0, ou !dots, renvoient 0 ou 1. C'est dans la norme. Même si dots
peut avoir d'autres valeurs.



Pour /normaliser/ une valeur: !!dots ou (dots!=0)

--
Pierre Maurette
Avatar
Marc Boyer
Le 18-06-2010, Wykaaa a écrit :
Marc Boyer a écrit :
Voilà. A titre personnel, je trouve la version originale
plutôt pas mal. Mais peut-être que l'opérateur ?: va dérouter
des programmeurs moins habitués.



Ah oui, pourquoi ?
Disons qu'il serait surprenant qu'un bon programmeur C soit surpris par
ce code ;-)
Quant aux autres, il vaudrait mieux qu'ils codent dans un autres
langage, peut-être...



Ca a beau être de l'humour, c'est à mon avis révélateur d'un esprit
de corps.
Je ne suis pas pour dire que n'importe qui doit pouvoir coder,
qu'il faut une formation, que c'est un métier sérieux.
Mais j'avais plutôt tendance à dire à mes étudiants que leur code
devait pouvoir être relu par quelqu'un de moins intelligent. C'est
de l'humour, mais ça marquait.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
PIGUET Bruno
Le Mon, 21 Jun 2010 14:00:24 +0000, Marc Boyer a écrit :

Mais j'avais plutôt tendance à dire à mes étudiants que leur code
devait pouvoir être relu par quelqu'un de moins intelligent. C'est de
l'humour, mais ça marquait.



disclaimer :
Je ne suis pas développeur professionnel, ni enseignant.

Mais je code de plus en plus dans un style simple, un espèce de pseudo-
code clair relisible par n'importe-qui ayant appris un langage procédural
(Fortran, Pascal, ...).
Dans la vraie vie, ça évite pas mal de se faire bousiller son code par
un suivant qui débarque et n'y comprend pas grand-chose.

Même --et surtout-- quand ce suivant, c'est soit-même, ayant tout
oublié du problème initial, quelques mois plus tard ;-)

Bruno.
1 2