繁体   English   中英

C#对Int32文字到浮点数的性能损失

[英]C# Performance penalty for Int32 literals to floats

在c#中,您可以将数字文字定义为int或double

    Double var1 = 56.1;
    int var2 = 51;

这些是文字分配的默认类型。 但是,我正在使用的游戏引擎使用浮点数进行位置,旋转等。当浮点数被赋值为文字双float varFloat = 75.4; ,即float varFloat = 75.4; 编译器抛出一个错误,说双文字需要是一个浮点数,这是正确的。 因此,需要将双文字转换为浮动,即。 float varFloat = 75.4f; 但是,当给定int文字时,int会隐式转换为float。 也就是说,

    float varFloat = 44; // This is fine.

我的问题是编译器是否足够聪明才能意识到44应该是float字面值? 如果不是,这意味着每次访问文字时,它也会执行转换。 在大多数情况下,这无关紧要。 但是对于高性能代码,如果整个地方使用整数而不是浮点数,它可能会成为一个问题(即使它是一个小问题)。 据我所知,没有办法将这些文字更改为浮点数而不经过源代码行,而这些源代码实际上根本没有花费时间。

那么,编译器是否将int文字转换为float文字? 如果没有,除了试图避免它之外,还可以做些什么呢?

答案是肯定的。 知道这一点很聪明。

这是一个反汇编的IL(由ILSpy提供 )一个简单的程序,它具有这样的任务。 从ldc.r4指令可以看出,没有发生转换:

.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

float比“double”小“

当您尝试将float转换为double时,可能会失去精度

看到这个: C:将double转换为float,保持小数点精度

关于C#也是如此

当你写float x = 5; 编译器将在编译时将其转换为float x = 5.0;

没有性能问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM