[英]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.