![](/img/trans.png)
[英]How significant is a performance penalty for using Int64/bigint instead of Int32/int in a C#4/T-SQL2008 application under 32-bit Windows XP?
[英]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.