33780

33781

Zerosquare (./33772) :
(Par ailleurs, je pressens que Ximoon aura deux mots à te dire à propos de l'utilisation de continue tongue)

Bingo grin Sur l'appel d'une fonction dans un test conditionnel, également. Bref je ne suis pas fan du tout grin

Et pour savoir si c'est réellement optimisé il faudrait savoir le type de données qui sont traitées, car si tu gagnes du temps lorsque les premières données de tes buffers sont égales, tu perds du temps sinon. Quel est le cas le plus fréquent? (encore que maintenant avec l'exécution parallèle de branches de décisions, ça peut revenir au même, mais salue spectre et meltdown pour moi, par contre si tu n'as pas de prédiction de branche sur ton architecture, ça peut être le contraire: tu risques de pourrir ton cache et ton pipeline).

Ensuite pour un lookup, ça dépend encore du type de données et de comment elles sont rangées dans le buffer. Mais ça, c'est à toi de voir.

Globalement je pencil Zerosquare, sans surprise.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

33782

Pen^2 (./33774) :
(c'est pas les pointeurs c'est les premiers éléments respectifs que Folco compare — je suggère de tester les autres aussi en dur en déroulant #modui#)
Oula, fatigué moi o_o
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33783

perso je pense que c'est une optimisation de bout de chandelle. (grin)

33784

Zeph (./33779) :
./33776 : boah ça me semble pas si terrible ça, c'est également utile si tu veux faire une boucle entre zéro et une borne variable (genre strlen(toto)) sans forcément avoir à la déclarer dans une variable temporaire qui ne sert qu'à ça. C'est un petit hack, mais quand c'est pour implémenter un algo qui n'a aucune raison de parcourir une collection dans un sens plutôt que dans un autre ça ne me choque pas.

je suis sur a 99% que n'importe quel compilo actuel est capable de pousser le resultat de strlen sur la pile et de s'en servir dans la boucle: https://godbolt.org/g/acSEMX (et ca al'air de le faire aussi avec une strlen bricolee a la main)

33785

Hmmmm:

https://godbolt.org/g/sVg5LB


En -O3 il deroule la boucle et produit enormement de code utilisant la vectorisation, c'est interessant, mais rend vraiment illisible. En -Os c'est plus interesant.

calc() va appeler strlen a chaque boucle, alors que calc2 non (ca parait logique vu le code, et passer un "const char *" n'y change rien) fait intéressant, calc2 utilise deux index, rbx comme position dans la chaine, rcx comme compteur, et le compteur lui est décentrementé. Donc le compilateur est tout a fait capable d'inverser le comptage pour rendre les choses "plus simple"

Autre point interessant, GCC ne produit pas le meme code:
https://godbolt.org/g/4ySEsN

strlen est inliné pour les deux fonction (repnz scasb) et n'est executé qu'une seule fois dans le cas de calc
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33786

pourtant la vectorisation c'est le bien cheeky

33787

Ca rend le code un peu (mais juste un peu) illisible XD
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33788

33789

Ximoon -> c'est un blob qui comprend des données de config, des chemins d'accès, les sources du programes et diverses données sérialisées.
Pourquoi n'es-tu pas fan de l'appel de fonction dans le test ? un truc du genre if (strlen(str)) te raye les yeux ? Et pour quelles raisons ?

L'archi utilsée est un x86.
Mais je peux pas comprendre comment ça perdrait du temps de comparer deux caractères (cmp.b x(an),dn) vs un appel de fonction, avec push/pop de trois arguments pour chaque caractère.

33790

Ce if avec strlen n’est pas forcément un probleme (même si il serais plus claire de faire un test explicite

If (strlen(x) > 0)


Qui est plus lisible.

Pour d’autre fonction qui peuvent retourner 0 ou une valeur positive si tôt vas bien ou une valeur négative en cas d’erreur, le if va trigger si il y a une erreur comme si en fait tout allez bien, et comme tu ne sauvegarde pas la valeur tu ne peux pas savoir.

Genre en supposant que strlen puisse retourner une erreur (ce n’est pas le cas) pour dire par exemple que le pointeur est invalide, cette construction est foireuse.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33791

Non mais si j'ai besoin d'une valeur précise, je fais un appel séparé, suivi switch/case ou if/else if/else suivant les cas.
La question que je me pose, c'est l'utilisation d'une fonction dans la condition d'un if

33792

Folco (./33789) :
Pourquoi n'es-tu pas fan de l'appel de fonction dans le test ?
Parce qu'il a bon goût embarrassed
Pour débugguer c'est pénible déjà, ça ne nomme rien, etc.

(et if (trucQuiRetourneUnPasBool(str)) est pire que tout embarrassed)

33793

Folco (./33789) :
Ximoon -> c'est un blob qui comprend des données de config, des chemins d'accès, les sources du programes et diverses données sérialisées.
Pourquoi n'es-tu pas fan de l'appel de fonction dans le test ? un truc du genre if (strlen(str)) te raye les yeux ? Et pour quelles raisons ?
Comme l'a dit Godzil, c'est déjà moins lisible (même si le test est implicitement de savoir si la valeur de retour n'est pas zéro, c'est toujours mieux de voir ça explicitement, c'est plus lisible), et ensuite ça empêche notamment de mettre un point d'arrêt pour visualiser la valeur de la variable de retour lorsque tu débogues.

L'archi utilsée est un x86.
Mais je peux pas comprendre comment ça perdrait du temps de comparer deux caractères (cmp.b x(an),dn) vs un appel de fonction, avec push/pop de trois arguments pour chaque caractère.
Simple: si les deux premières valeurs sont égales, tu n'exécutes que ton test. Par contre, si elle ne le sont pas, tu les testes une fois, puis tu appelles la fonction memcmp dans laquelle elles sont à nouveau testées. Donc si tes buffers sont différents mais pas à partir de la première donnée, ton appel sera en fait plus lent. Tout dépend donc de la première donnée dans le buffer, si elle est plus volatile que le reste. Je dirais même plus, lors de l'appel à la fonction tu sais déjà que les valeurs sont égales, tu peux donc commencer à la donnée d'après.

edit: cross, et pencil
edit2: après, c'est presque tolérable (tout en l'étant pas, j'insiste sur le "presque") si les fonctions sont nommées explicitement pour parer au manque de variable entre les deux, par exmeple if(IsValueCorrect(truc)), comme ça tu as une idée, alors qu'avec if(FonctionAbcdEf12(machin)) tu es un peu niqué. Et c'est valable pour les fonction standard. Et ça rejoint ce que dit Pen², puisque ce n'est possible de faire ça presque que si l'on retourne des booléens.
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

33794

33795

user_home = str(Path.home())
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33796

33797

user_home = str(Path.home())
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33798

avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

33799

e

33800

33801

protected virtual void FromStream<TKey>(Stream fileStream, StorageOptions options) where TKey : struct { IReader fileReader = null; Signatures signature; using (var reader = new BinaryReader(fileStream, true)) { signature = (Signatures)reader.ReadUInt32(); switch (signature) { case Signatures.WDBC: fileReader = new WDBC(fileStream); break; case Signatures.WDB2: fileReader = new WDB2(fileStream); break; case Signatures.WDB5: fileReader = new WDB5<TKey>(fileStream); break; case Signatures.WDB3: case Signatures.WDB4: throw new NotSupportedVersionException($"{signature} files cannot be read without client metadata."); default: throw new NotSupportedVersionException($"Unknown signature 0x{(int)signature:X8}!"); } } fileReader.Options = options; if ( !fileReader.ReadHeader()) return; fileReader.ReadSegments(); LoadRecords(fileReader); }

33802

0.06315
avatar
Webmaster du site Ti-FRv3 (et aussi de DevLynx)
Si moins de monde enculait le système, alors celui ci aurait plus de mal à nous sortir de si grosses merdes !
"L'erreur humaine est humaine"©Nil (2006) // topics/6238-moved-jamais-jaurais-pense-faire-ca

33803

pwd
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33804

Warpten (./33784) :
je suis sur a 99% que n'importe quel compilo actuel est capable de pousser le resultat de strlen sur la pile et de s'en servir dans la boucle
C'était un exemple parmi d'autres, tu peux remplacer strlen par n'importe quelle fonction pure non-triviale qu'un compilo ne saura pas détecter comme pure et le problème restera identique.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

33805

pas sur de ce que tu apelle par "pure", mais les compilateurs detectent plutot bien les fonctions qui pour une valeur donné va retourner toujours la meme chose.
Les compilateurs sont aussi relativement bon pour inliner les fonctions.

godbolt.org permet de bien experimenter avec ca et de voir ce qui subit ou pas une optimisation.
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33806

pure = sans effet de bord autre que la valeur de retour.

33807

Comment ça fonctionnerait quand le compilo n'a pas accès à cette info, sachant qu'a priori elle est perdue à la compilation ? Si mon équivalent de fonction strlen vient d'une bibliothèque externe il n'y a que le linker qui pourrait éventuellement faire quelque chose, mais d'une part c'est pas son boulot et d'une autre c'est un peu trop tard :/
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

33808

Je viens de regarder, MinGW utilise la déclaration suivante dans string.h : _CRTIMP size_t __cdecl __MINGW_NOTHROW strlen (const char*) __MINGW_ATTRIB_PURE;Donc la fonction est explicitement indiquée comme pure dans les headers. Si tu utilisais un strlen() externe qui ne le serait pas, logiquement le header serait différent, donc pas de souci.
avatar
Zeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo

33809

Attention, redefinir des fonctions de la libc peux causer des problemes (surtout avec GCC qui inline automatiquement certains trucs comme strlen)
avatar
Proud to be CAKE©®™


GCC4TI importe qui a problème en Autriche, pour l'UE plus et une encore de correspours nucléaire, ce n'est pas ytre d'instérier. L'état très même contraire, toujours reconstruire un pouvoir une choyer d'aucrée de compris le plus mite de genre, ce n'est pas moins)
Stalin est l'élection de la langie.

33810

La convention d'appel sur les compilos ordinaires x86 garantit que les arguments sur la pile ne sont pas détruits ?