3 votes

C# Pénalité de performance pour les littéraux Int32 en floats

En C#, vous pouvez définir un nombre littéral comme int ou double.

    Double var1 = 56.1;
    int var2 = 51;

Ce sont les types par défaut qui sont attribués aux littéraux. Toutefois, le moteur de jeu sur lequel je travaille utilise des flottants pour la position, la rotation, etc. Lorsque l'on attribue au flottant un double littéral, par ex, float varFloat = 75.4; le compilateur génère une erreur en disant que le double littéral doit être un flottant, ce qui est correct. Il faut donc transformer le double littéral en un flottant. float varFloat = 75.4f; . Cependant, lorsqu'on lui donne un littéral int, celui-ci est implicitement converti en flottant. Par exemple,

    float varFloat = 44; // This is fine.

Ma question est la suivante : le compilateur est-il assez intelligent pour réaliser que 44 devrait être un littéral de type float ? Si ce n'est pas le cas, cela signifie qu'à chaque fois que l'on accède à ce littéral, on effectue également une conversion. Dans la plupart des cas, cela n'a pas vraiment d'importance. Mais avec un code à haute performance, cela pourrait potentiellement devenir un problème (même s'il est mineur) si les ints sont utilisés partout au lieu des flottants. Pour autant que je sache, il n'y a aucun moyen de changer ces littéraux en flottants sans passer par des lignes de code source, ce qui n'est vraiment pas du temps bien dépensé.

Alors, le compilateur convertit-il le littéral int en littéral float ? Si ce n'est pas le cas, que peut-on faire pour éviter ce gaspillage de puissance de traitement, à part essayer de l'éviter ?

8voto

Dave Markle Points 44637

La réponse est oui. Il est assez intelligent pour le savoir.

Voici l'IL démonté (avec l'aimable autorisation de ILSpy ) d'un programme simple qui possède une telle affectation. Comme vous pouvez le constater à partir de l'instruction ldc.r4 il n'y a pas de conversion en cours :

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 8 (0x8)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] float32 x
    )

    IL_0000: nop
    IL_0001: ldc.r4 44
    IL_0006: stloc.0
    IL_0007: ret
} // end of method Program::Main

3voto

Nahum Litvin Points 2593

Float est "plus petit" que double

quand vous essayez de convertir un float en double, vous pouvez perdre de la précision

voir ça : C : convertir un double en flottant, en préservant la précision du point décimal

Il en va de même pour le C#

lorsque vous écrivez float x = 5 ; le compilateur, au moment de la compilation, le convertira en float x = 5.0 ;

aucun problème de performance

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X