CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Optimisation d'une fonction sgn

Lagrangien
Lagrangien
Niveau 8
11 mars 2013 à 00:56:28

Imaginons que je sois obligé d'utiliser ma propre fonction signum. Dans notre cas on dira que sgn(n) fonction renvoie -1 si n est negatif, et 1 si n est positif. Son comportement n'est pas défini pour n = 0 et on l'assume.

Laquelle de ces 2 formulations est la plus rapide sachant que c'est un programme écrit en C? et en Python?

(formulations en pseudocode)

sgn(n):
if(n>0) return 1
return -1

sgn(n):
return -1+2*(n>0)

:(

Pseudo supprimé
Pseudo supprimé 11 mars 2013 à 02:01:29

Bah teste ? :p
En tout cas c'est moche.

godrik
godrik
Niveau 30
11 mars 2013 à 04:51:37

Il est difficile de repondre a une question comme celle la. Ca depend beaucoup de ce que le compilateur va faire. Et de comment le processeur est construit.

Cependant, la fonction est tellement simple qu'il ne devrait pas etre important quelle version est la plus rapide. Deplus ca change certainement d'un processeur a l'autre.

chris_27
chris_27
Niveau 10
11 mars 2013 à 09:24:49

Personnellement, je pense qu'il est au contraire trivial de répondre à une telle question. :-p

En C, je ne vois pas pourquoi le second code serait correct déjà. Et puis de toute façon, c'est le boulot du compilateur de transformer la première version en quelque chose d'efficace sur l'architecture cible. D'ailleurs, ce qui me vient en tête c'est plutôt :

sgn(n):
return (n & (0x80000000) >> 30) + 1

(code à ajuster en fonction de la taille des entiers) si n est entier, et

sgn(n):
return (n & 0x8000000000000000) | 0x7ff0000000000000

si n est un double.

PS: Ne pas utiliser le premier code tel quel en C, ça ne marchera sans doute pas à cause du >> qui risque de ne pas être traduit en un shift arithmetique. Quant au deuxième code, il faudra abuser du cast (et passer par du unsigned long*) pour le faire marcher correctement en C.

PPS: "(formulations en pseudocode) " :d) non, formulation en python (modulo l'omission de def) :-(

chris_27
chris_27
Niveau 10
11 mars 2013 à 09:27:32

J'oubliais... en python, la question ne se pose juste pas. La couche d'interprétation fait que ce genre d'optimisations n'apporte rien d'autre que des noeuds au cerveau.

_skip
_skip
Niveau 10
11 mars 2013 à 09:52:18

Comme godrik j'aurai opté pour un test.
Les micro-optimisations c'est tellement contre-intuitif parfois...

Pseudo supprimé
Pseudo supprimé 11 mars 2013 à 10:01:47

Chris_27 :d) Je comptais poster une solution similaire (n & MOST_SIGNIFICANT_BIT_HERE ) >> TYPE_BITS (Pour un nombre entier). Avec la même réserve sur le comportement du décalage (conservera-t-il le signe ?).
Pour python, je confirme que ça n'a pas trop de sens d'essayer de gratter quoi que ce soit à ce niveau :D

Pseudo supprimé
Pseudo supprimé 11 mars 2013 à 10:23:43

((n & MOST_SIGNIFICANT_BIT_MASK_HERE ) >> TYPE_BITS)|1

J'avais oublié un bout. Encore une fois, uniquement si
0x80000000>>32 = 0xFFFFFFFF

EDIT : En C, >> a un comportement signé si le type décalé est signé, cool :)

Lagrangien
Lagrangien
Niveau 8
11 mars 2013 à 13:43:47

ok merci

godrik
godrik
Niveau 30
12 mars 2013 à 16:48:29

Chris le second code est correcte en C I'll me semble. Qu'est ce qui t'embete ?

Selon l'architecture. Le premier code peut se faire en 3 instructions le deuxieme pourrait en couter plus. (En fonction de la presence d'encodage de constante dans le jeu d'instruction)

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment